所以我在Python3.5上使用psycopg2将一些数据插入到postgresql数据库中。我想要做的是有两列是字符串,最后一列只是一个dict对象。我不需要搜索dict,只能将其从数据库中取出并使用它。
所以例如:
uuid = "testName"
otherString = ""
dict = {'id':'122','name':'test','number':'444-444-4444'}
# add code here to store two strings and dict to postgresql
cur.execute('''SELECT dict FROM table where uuid = %s''', 'testName')
newDict = cur.fetchone()
print(newDict['number'])
这是可能的吗?如果可以的话,我该如何做呢?
答案 0 :(得分:9)
如果你的PostgreSQL版本足够新(9.4+)并且psycopg版本是> = 2.5.4,所有键都是字符串,值可以表示为JSON,最好将它存储到JSONB列中。然后,如果需要,该列也将是可搜索的。只需将表格创建为
即可CREATE TABLE thetable (
uuid TEXT,
dict JSONB
);
(...然后根据需要自然添加索引,主键等...)
将字典发送到PostgreSQL时,只需要用Json
适配器包装它;当从PostgreSQL接收时,JSONB值将自动转换为字典,因此插入将变为
from psycopg2.extras import Json, DictCursor
cur = conn.cursor(cursor_factory=DictCursor)
cur.execute('INSERT into thetable (uuid, dict) values (%s, %s)',
['testName', Json({'id':'122','name':'test','number':'444-444-4444'})])
选择就像
一样简单cur.execute('SELECT dict FROM thetable where uuid = %s', ['testName'])
row = cur.fetchone()
print(row['dict']) # its now a dictionary object with all the keys restored
print(row['dict']['number']) # the value of the number key
使用JSONB,PostgreSQL可以更有效地存储值,而不仅仅是将字典转储为文本。此外,可以使用数据进行查询,例如,只需从JSONB列中选择一些字段:
>>> cur.execute("SELECT dict->>'id', dict->>'number' FROM thetable")
>>> cur.fetchone()
['122', '444-444-4444']
或者如果需要,您可以在查询中使用它们:
>>> cur.execute("SELECT uuid FROM thetable WHERE dict->>'number' = %s',
['444-444-4444'])
>>> cur.fetchall()
[['testName', {'id': '122', 'name': 'test', 'number': '444-444-4444'}]]
答案 1 :(得分:1)
您可以在存储数据之前使用JSON序列化数据:
import json
data = json.dumps({'id':'122','name':'test','number':'444-444-4444'})
然后在检索代码时对其进行反序列化:
cur.execute('SELECT dict from ....')
res = cur.fetchone()
dict = json.loads(res['dict'])
print(dict['number'])