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