为什么要在postgresql JSON字段中添加一个完美的JSON字符串?

2024-10-01 11:30:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

^{pr2}$

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

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

数据库中的JSON数据如下:

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

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


Tags: 对象字符串数据库json定义sqlalchemyvaluepostgresql
3条回答

嗯,但我不想像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字段值设置为:

^{pr2}$

在我把json.dumps文件(…)只需:

 row[some_jsonb_field] = some_dict

在数据库中一切看起来更好:没有更多额外的\or“。在

我再一次意识到Python和SQLAlchemy已经 注意细节,比如json.dumps文件. 代码越少,满意度越高。在

简而言之:是的,你必须这样做。在

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

database_value = json.dumps(python_value)

在商店里,和使用

^{pr2}$

您存储了一个字符串,并将其转换为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 type文档。在

相关问题 更多 >