我是python的新手,甚至是SQL的新手,并且遇到了以下问题:
我想在我的SQL数据库中的单个单元格中插入一个列表(或实际上是一个包含一个或多个词典的列表)。这是我的一行数据:
sqlite3.InterfaceError: Error binding parameter 2 - probably unsupported type.
由于列表中的字典数量不同,我想稍后迭代列表中的元素,我认为将它保存在一个地方是有意义的(因此不会将列表拆分为单个元素)。但是,当尝试按原样插入列表时,我收到以下错误:
**// Option 1 - SMB2 and SMB3:**
Properties prop = new Properties();
prop.put( "jcifs.smb.client.enableSMB2", "true");
prop.put( "jcifs.smb.client.disableSMB1", "false");
prop.put( "jcifs.traceResources", "true" );
Configuration config = new PropertyConfiguration(prop);
CIFSContext baseContext = new BaseContext(config);
CIFSContext contextWithCred = baseContext.withCredentials(new NtlmPasswordAuthentication(baseContext, domain, fileSystemInfo.getUsername(), fileSystemInfo.getPassword()));
SmbFile share = new SmbFile(fullPath.replace('\', '/'), contextWithCred);
if (!share.exists())
{
share.mkdirs();
}
share.close();
如何将这种列表插入到我的SQL数据库的单个单元格中?
答案 0 :(得分:1)
SQLite没有'嵌套'列的功能;您必须将列表存储为 text 或二进制数据blob;在途中将其序列化,在出路时再次对其进行反序列化。
如何序列化文本或二进制数据取决于您的用例。如果您的列表和词典仅包含文本,数字,布尔值和None
(字典仅使用字符串作为键),则JSON(通过json
module可能是合适的.JSON受到各种各样的支持其他语言,所以你保持你的数据合理兼容。或者你可以使用pickle
,它允许你序列化为二进制格式,并可以处理Python可以抛出的任何东西,但它特定于Python。
然后,您可以register an adapter处理序列化格式和Python列表之间的转换:
import json
import sqlite
def adapt_list_to_JSON(lst):
return json.dumps(lst).encode('utf8')
def convert_JSON_to_list(data):
return json.loads(data.decode('utf8'))
sqlite3.register_adapter(list, adapt_list_to_JSON)
sqlite3.register_converter("json", convert_JSON_to_list)
然后与detect_types=sqlite3.PARSE_DECLTYPES
联系并将您的列类型声明为json
,或使用detect_types=sqlite3.PARSE_COLNAMES
并在列别名([json]
)中使用SELECT datacol AS "datacol [json]" FROM ...
来触发加载转换。