我想插入一个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(“导入产品(store_id,url,price,characteristics,color,dimensions)VALUES(%d,% s,% s,%d,%s)",(1,' http://www.google.com ','$20',thedictionary,' red ',' 8.5x11'))psycopg2.ProgrammingError:can't adapt type 'dict'
我不知道如何从这里开始。我在互联网上找不到任何关于如何做这种确切的事情,我是非常新的psycopg 2。
7条答案
按热度按时间vsdwdz231#
字符串
这将解决你的问题。然而,你真的应该将键和值存储在它们自己的单独列中。要检索字典,请执行以下操作:
型
ijnw1ujt2#
从psycopg docs:
注意你可以使用register_adapter()来将任何Python字典适配到JSON,无论是注册JSON还是任何子类或工厂创建一个兼容的适配器:
第一个月
这个设置是全局的,所以它不兼容类似的适配器,比如register_hstore()注册的适配器。JSON支持的任何其他对象都可以以同样的方式注册,但是这会破坏默认的适配规则,所以要小心不必要的副作用。
所以,在我的情况下,我所做的是:
字符串
它就像一个魅力。
zbsbpyhn3#
2023-12-25
目前,我更喜欢使用
sqlalchemy
将JSON数据插入PostgreSQL。字符串
答案在2020年。
您可以使用
psycopg2.extras.Json
将dict转换为postgre接受的json。型
有关更多信息,您可以查看官方文档。
型
dy1byipe4#
从psycopg2的2.5版本开始,您可以使用JSON适配器。
Psycopg可以使Python对象适应PostgreSQL json和jsonb类型。在PostgreSQL 9.2和以下版本中,可以开箱即用。
字符串
有关更多信息,请参阅文档:https://www.psycopg.org/docs/extras.html#json-adaptation
q3aa05255#
只需将dict类型转换为json_str,使用
json.dumps(adict)
。字符串
事实上,我喜欢另一种将数据转储到postgres的方法。
型
的数据
9wbgstp76#
首先,这个错误意味着你试图将一个
dict
值推入一个不能接受它的列类型(TEXT
等)。接受的解决方案是正确的,将其从JSON/dict -> string转换为存储它。
但是,有一种列类型可以接受它:JSON
我建议首先创建一个JSON字段,以保持类似于dict的对象。原因是:
1.你可以简单地将dict按原样推送到DB w/o
json.dumps
或其他转换(因为记住,当你推时-你需要json.dumps
,但当你稍后在python中读取它时,你需要json.loads
(从string -> dict转换回来)。1.你可以在一个真实的JSON列中查询它的内容,当它是一个字符串时你不能这样做。
https://www.postgresqltutorial.com/postgresql-json/
因此,当创建列时,我建议使用默认值
{}
vs NULL:字符串
kb5ga3dv7#
是否有特别的原因让你想把每个键作为自己的列?Postgres允许你在包含有效JSON或JSONB的单个列中执行直接查询操作
这意味着您可以简单地创建一个具有ID(主键)和元数据的2列DB,然后执行查询,例如:
字符串
Here对你来说是一个很好的资源。