将列表插入SQLite3单元格

时间:2018-01-26 18:07:59

标签: python sqlite

我是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数据库的单个单元格中?

1 个答案:

答案 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 ...来触发加载转换。