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 文档(psycopg2/extras 页面)它指出“从数据库中读取,json 值将自动转换为 Python 对象。”

使用 RealDictCursor 似乎并非如此。这意味着我无法访问 rows[0]['misc']['age'] 因为这很方便......

好的,我可以手动使用

for r in rows:
    r['misc'] = json.loads(r['misc'])

但如果我可以避免这种情况,因为有更好的解决方案......

附言。拥有 1500+ 代表的人可以创建 postgresql9.4 标签;-)

4

2 回答 2

5

当前的 psycopg 版本 (2.5.3) 不知道 jsonb 类型的 oid。为了支持它,调用它就足够了:

import psycopg2.extras
psycopg2.extras.register_json(oid=3802, array_oid=3807, globally=True)

一次在您的项目中。

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

于 2014-08-12T20:58:02.920 回答
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)
于 2017-04-12T17:28:49.823 回答