我想将一个python字典作为json插入到我的postgresql数据库中(通过python和psycopg2)。
我有:
thedictionary = {'price money': '$1', 'name': 'Google', 'color': '', 'imgurl': 'http://www.google.com/images/nav_logo225.png', 'charateristics': 'No Description', 'store': 'google'}
cur.execute("INSERT INTO product(store_id, url, price, charecteristics, color, dimensions) VALUES (%d, %s, %s, %d, %s, %s)", (1, 'http://www.google.com', '$20', thedictionary, 'red', '8.5x11'))
它给出了错误消息:
cur.execute(“INSERT INTO product(store_id,url,price,charecteristics,color,dimensions)VALUES(%d,%s,%s,%d,%s,%s)”,(1,'http://www.google.com', '$ 20',thedictionary,'red','8.5x11'))psycopg2.ProgrammingError:无法适应类型'dict'
我不知道如何从这里开始。我在互联网上找不到关于如何做这种事情的事情,我对psycopg2很新。
cur.execute("INSERT INTO product(store_id, url, price, charecteristics, color, dimensions) VALUES (%s, %s, %s, %s, %s, %s)", (1, 'http://www.google.com', '$20', json.dumps(thedictionary), 'red', '8.5x11'))
这将解决您的问题。但是,您确实应该将键和值存储在各自独立的列中。要检索字典,请执行以下操作:
cur.execute('select charecteristics from product where store_id = 1')
dictionary = json.loads(cur.fetchone()[0])
您可以使用psycopg2.extras.Json
将dict转换为postgre接受的json。
from psycopg2.extras import Json
thedictionary = {'price money': '$1',
'name': 'Google', 'color': '', 'imgurl': 'http://www.google.com/images/nav_logo225.png', 'charateristics': 'No Description', 'store': 'google'}
item ={
"store_id":1,
"url": 'http://www.google.com',
"price":'$20',
"charecteristics":Json(thedictionary),
"color":'red',
"dimensions":'8.5x11'
}
def sql_insert(tableName, data_dict):
'''
INSERT INTO product (store_id, url, price, charecteristics, color, dimensions)
VALUES (%(store_id)s, %(url)s, %(price)s, %(charecteristics)s, %(color)s, %(dimensions)s );
'''
sql = '''
INSERT INTO %s (%s)
VALUES (%%(%s)s );
''' % (tableName, ', '.join(data_dict), ')s, %('.join(data_dict))
return sql
tableName = 'product'
sql = sql_insert(tableName, item)
cur.execute(sql, item)
有关更多信息,请参阅the office document。
class psycopg2.extras.Json(adapted, dumps=None)
An ISQLQuote wrapper to adapt a Python object to json data type.
Json can be used to wrap any object supported by the provided dumps function. If none is provided, the standard json.dumps() is used (simplejson for Python < 2.6; getquoted() will raise ImportError if the module is not available).
dumps(obj)
Serialize obj in JSON format.
The default is to call json.dumps() or the dumps function provided in the constructor. You can override this method to create a customized JSON wrapper.
来自psycopg docs:
注意您可以使用register_adapter()使任何Python字典适应JSON,注册Json或任何子类或工厂创建兼容的适配器:
psycopg2.extensions.register_adapter(dict, psycopg2.extras.Json)
此设置是全局的,因此它与类似的适配器不兼容,例如register_hstore()注册的适配器。 JSON支持的任何其他对象都可以以相同的方式注册,但这将破坏默认的自适应规则,因此请注意不必要的副作用。
所以,就我而言,我所做的是:
from psycopg2.extensions import register_adapter
register_adapter(dict, Json)
它就像一个魅力。
是否有特殊原因要将每个键作为自己的列? Postgres允许您在包含有效JSON或JSONB的单个列中执行直接查询操作
这意味着您只需创建一个带有ID(主键)和元数据的2列数据库,然后执行以下查询:
SELECT * FROM users WHERE metadata @> '{"key": "value"}';
Here是一个很好的资源。