繁体   English   中英

为什么sqlalchemy添加\\“为了一个完美的JSON字符串到postgresql json字段?

[英]Why sqlalchemy add \ to " for a perfect JSON string to postgresql json field?

SQLAlchemy 0.9增加了对PostgreSQL的JSON数据类型的内置支持。 但是当我定义一个具有JSON字段的对象映射器并将其值设置为完美的JSON字符串时:

json = '{"HotCold":"Cold,"Value":"10C"}'

数据库以下列形式获取数据:

"{\"HotCold\":\"Cold\",\"Value":\"10C\"}"

所有内部双引号都被反斜杠,但是如果我从python dict中设置JSON:

json = {"HotCold": "Cold, "Value": "10C"}

我在数据库中获取JSON数据:

{"HotCold":"Cold,"Value":"10C"}

这是为什么? 我是否必须以dict格式传递数据以使其与SQLAlchemy JSON支持兼容?

简短的回答:是的,你必须这样做。

SQLAlchemy中的JSON类型用于将Python结构存储为JSON 它有效地做到了:

database_value = json.dumps(python_value)

在商店和使用

python_value = json.loads(database_value)

您存储了一个字符串,并将其转换为JSON值。 字符串本身包含JSON的事实只是一个巧合。 不存储JSON字符串,存储JSON可序列化的Python值。

一个快速演示来说明:

>>> print json.dumps({'foo': 'bar'})
{"foo": "bar"}
>>> print json.dumps('This is a "string" with quotes!')
"This is a \"string\" with quotes!"

请注意第二个示例如何应用完全相同的引用。

使用JSON SQLAlchemy类型在对象上存储额外的结构化数据; PostgreSQL允许您访问服务器端SQL表达式中的内容,SQLAlchemy使您可以在Python端以Python值的形式完全访问内容。

考虑到您应该始终在对象上重新设置整个值。 不要改变其中的值并期望SQLAlchemy自动检测到更改; 请参阅PostgreSQL JSON类型文档。

嗯,但我不想像在json.loads()那样进行三次往返,传递给SQLAlchemy,然后执行json.dumps() ,然后Postgres再次进行解组。

因此,我创建了一个元数据表,它将jsonb列类型指定为Text。 现在我接受我的json字符串,SQLALchemy传递它们,Postgres将它们存储为jsonb对象。

import sqlalchemy as sa
metadata = sa.MetaData()
rawlog = sa.Table('rawlog', metadata, sa.Column('document', sa.Text)
with create_engine("postgresql:///mydb") as engine:
    with engine.acquire() as conn:
        conn.execute(rawlog.insert().values(document=document)

其中document是一个字符串,而不是一个python对象。

我今天遇到了类似的情况:

after inserting new row with a JSONB field via SQLAlchemy, I checked PostgreSQL DB:
"jsonb_fld"
"""{\""addr\"": \""66 RIVERSIDE DR\"", \""state\"": \""CA\"", ...

回顾Python代码,它设置了JSONB字段值,如下所示:

 row[some_jsonb_field] = json.dumps(some_dict)

在我取出json.dumps(...)后,只需:

 row[some_jsonb_field] = some_dict

在DB中一切看起来都更好:没有更多的额外\\或“。

我再次意识到Python和SQLAlchemy在这种情况下已经处理了细微的细节,比如json.dumps。 代码少,满意度更高。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM