jsonb与psycopg2 RealDictCursor

时间:2014-08-12 11:59:39

标签: postgresql python-3.x psycopg2 postgresql-9.4

我有一个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标签; - )

2 个答案:

答案 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)