Postgresql 带psycopg2 RealDictCursor的jsonb

Postgresql 带psycopg2 RealDictCursor的jsonb,postgresql,python-3.x,psycopg2,postgresql-9.4,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" :

我有一个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文档中可以看出,从数据库读取的json值将自动转换为Python对象

对于RealDictCursor,情况似乎并非如此。 这意味着我无法访问行[0]['misc']['age'],因为这样比较方便

好的,我可以用手工操作

for r in rows:
    r['misc'] = json.loads(r['misc'])
但如果我能避免,因为有更好的解决方案

附言。
拥有1500+rep的用户可以创建postgresql9.4标记-

当前的psycopg版本2.5.3不知道jsonb类型的oid。为了支持它,只需调用:

import psycopg2.extras
psycopg2.extras.register_json(oid=3802, array_oid=3807, globally=True)
一旦进入你的项目


您可以在中找到更多信息。

使用psycopg2.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)

看起来psycopg2还不明白jsonb也是一种json类型。你是最新的psycopg2吗?如果是这样的话,您可能需要添加一个类型处理程序——如何添加,请参阅psycopg2文档——直到它具有本机支持?从测试中选择id、name、misc::json@ClodoaldoNeto,好主意:它可以转换为json,psycopg2会像预期的那样以“dict”的形式返回misc!thx@CraigRinger,使用2.5.3,这是Debian测试中当前的python3-psycopg2。Yop我在文档中看到过,但我怀疑INSERT将dict转换为json更有用,但我的理解可能是错误的。这很有道理。psycopg2识别json类型,但尚未识别jsonb类型。注意:在发布PostgreSQL 9.4之前,应在psycopg 2.5.4中添加透明jsonb支持。