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

Nat*_*tal 7 python postgresql json sqlalchemy

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

json = '{"HotCold":"Cold,"Value":"10C"}'
Run Code Online (Sandbox Code Playgroud)

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

"{\"HotCold\":\"Cold\",\"Value":\"10C\"}"
Run Code Online (Sandbox Code Playgroud)

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

json = {"HotCold": "Cold, "Value": "10C"}
Run Code Online (Sandbox Code Playgroud)

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

{"HotCold":"Cold,"Value":"10C"}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 9

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

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

database_value = json.dumps(python_value)
Run Code Online (Sandbox Code Playgroud)

在商店和使用

python_value = json.loads(database_value)
Run Code Online (Sandbox Code Playgroud)

您存储了一个字符串,并将其转换为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!"
Run Code Online (Sandbox Code Playgroud)

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

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

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