Postgresql 带psycopg2 RealDictCursor的jsonb
我有一个postgresql 9.4又名mongodb杀手;-这个简单的模式是: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" :
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支持。