我有一个postgresql 9.4(又名mongodb杀手;-))和这个简单的架构:
CREATE TABLE test (id SERIAL, name text, misc jsonb);
现在我填充这个,如果我做一个选择,它将显示类似
id | name | misc
1 | user1 | { "age" : 23, "size" : "M" }
2 | user2 | { "age" : 30, "size" : "XL" }
现在,如果我使用psycopg2发出请求,
cur.execute("SELECT * FROM test;")
rows = list(cur)
我最终会
[ { 'id' : 1, 'name' : 'user1', 'misc' : '{ "age" : 23, "size" : "M" }' },
{ 'id2' : 2, 'name' : 'user2', 'misc' : '{ "age" : 30, "size" : "XL' }' }]
你会告诉我什么错?好misc是类型str。我希望它被识别为json并转换为Python dict。
来自psycopg2 doc(psycopg2/extras page)它声明"从数据库中读取,json值将自动转换为Python对象。"
使用RealDictCursor似乎并非如此。 这意味着我无法访问行[0] [' misc'] [' age']因为它很方便...
好的,我可以用
手动完成for r in rows:
r['misc'] = json.loads(r['misc'])
但如果我可以避免这种情况,因为这是一个更好的解决方案......
PS。 拥有1500+代表的人可以创建postgresql9.4标签; - )
答案 0 :(得分:5)
当前的psycopg版本(2.5.3)不知道jsonb类型的oid。为了支持它,就足以致电:
import psycopg2.extras
psycopg2.extras.register_json(oid=3802, array_oid=3807, globally=True)
一旦进入你的项目。
您可以在this ML message。
中找到更多信息答案 1 :(得分:1)
使用psycopg2 2.7.1开箱即用(不需要json.loads - 字典是查询的结果。)
sudo apt-get install libpq-dev
sudo pip install psycopg2 --upgrade
python -c "import psycopg2 ; print psycopg2.__version__"
2.7.1 (dt dec pq3 ext lo64)