Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将元组保存为Python中Sqlite3中的blob数据类型_Python_Database_Sqlite - Fatal编程技术网

将元组保存为Python中Sqlite3中的blob数据类型

将元组保存为Python中Sqlite3中的blob数据类型,python,database,sqlite,Python,Database,Sqlite,我有一本python词典。它们的键是大小不同的元组,包含unicode字符,值只是一个整数。我想用一个2列表将这个字典插入sqlite db 第一列是键值,第二列应该有相应的int值。我为什么要这样做?我有一个非常大的字典,我使用了cPickle,甚至将协议设置为2。大小仍然很大,保存和加载此文件需要很多时间。所以我决定把它保存在db中。这个字典只在程序开始时加载一次到内存中,所以没有额外的操作 现在的问题是,我希望将元组完全保存为元组(而不是字符串),因此每当我将表加载到内存中时,我都可以立即

我有一本python词典。它们的键是大小不同的元组,包含unicode字符,值只是一个整数。我想用一个2列表将这个字典插入sqlite db

第一列是键值,第二列应该有相应的int值。我为什么要这样做?我有一个非常大的字典,我使用了cPickle,甚至将协议设置为2。大小仍然很大,保存和加载此文件需要很多时间。所以我决定把它保存在db中。这个字典只在程序开始时加载一次到内存中,所以没有额外的操作

现在的问题是,我希望将元组完全保存为元组(而不是字符串),因此每当我将表加载到内存中时,我都可以立即毫无问题地构建字典。
有人知道我怎么做吗?

有几件事。首先,SQLite不允许直接存储Python数据结构。其次,我猜您希望能够按需通过元组键查询值,因此您不希望pickle和unpickle,然后在dict中搜索键

问题是,您不能使用tuple进行查询,也不能将tuple条目拆分为自己的列,因为它们的大小不同。如果必须使用SQLite,则必须连接元组中的unicode字符,可能需要使用不是元组值中字符之一的分隔符。将其用作键,并将其作为主键列存储到SQLite中的列中

def tuple2key(t, delimiter=u':'):
    return delimiter.join(t)

import sqlite3

conn = sqlite3.connect('/path/to/your/db')
cur = conn.cursor()

cur.execute('''create table tab (k text primary key, value integer)''')

# store the dict into a table
for k, v in my_dict.iteritems():
    cur.execute('''insert into tab values (?, ?)''', (tuple2key(k), v))

cur.commit()

# query the values
v = cur.execute(''' select value from tab where key = ? ''', tuple2key((u'a',u'b'))).fetchone()

有几件事。首先,SQLite不允许直接存储Python数据结构。其次,我猜您希望能够按需通过元组键查询值,因此您不希望pickle和unpickle,然后在dict中搜索键

问题是,您不能使用tuple进行查询,也不能将tuple条目拆分为自己的列,因为它们的大小不同。如果必须使用SQLite,则必须连接元组中的unicode字符,可能需要使用不是元组值中字符之一的分隔符。将其用作键,并将其作为主键列存储到SQLite中的列中

def tuple2key(t, delimiter=u':'):
    return delimiter.join(t)

import sqlite3

conn = sqlite3.connect('/path/to/your/db')
cur = conn.cursor()

cur.execute('''create table tab (k text primary key, value integer)''')

# store the dict into a table
for k, v in my_dict.iteritems():
    cur.execute('''insert into tab values (?, ?)''', (tuple2key(k), v))

cur.commit()

# query the values
v = cur.execute(''' select value from tab where key = ? ''', tuple2key((u'a',u'b'))).fetchone()

我认为最好在表中创建3列—key1、key2和value

如果希望将键保存为元组,则仍然可以使用pickle,但只能应用于键。然后可以将其保存为blob

>>> pickle.dumps((u"\u20AC",u"\u20AC"))
'(V\\u20ac\np0\ng0\ntp1\n.'
>>> pickle.loads(_)
(u'\u20ac', u'\u20ac')
>>>

我认为最好在表中创建3列—key1、key2和value

如果希望将键保存为元组,则仍然可以使用pickle,但只能应用于键。然后可以将其保存为blob

>>> pickle.dumps((u"\u20AC",u"\u20AC"))
'(V\\u20ac\np0\ng0\ntp1\n.'
>>> pickle.loads(_)
(u'\u20ac', u'\u20ac')
>>>

可以将元组存储到sqlite db中,并在元组上创建索引。它需要一些额外的代码才能完成。 在这种特殊情况下,将元组存储到db中是否是合适的解决方案是另一个问题(可能更适合使用双键解决方案)


可以将元组存储到sqlite db中,并在元组上创建索引。它需要一些额外的代码才能完成。 在这种特殊情况下,将元组存储到db中是否是合适的解决方案是另一个问题(可能更适合使用双键解决方案)