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支持兼容?
简短的回答:是的,你必须这样做.
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类型文档.