簡體   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