[英]Python SqlAlchemy adding escape characters to json string while inserting in postgresql json column, so queries not working
我正在使用 sqlalchemy 庫將 JSON 字符串添加到 python 中的 Postgres jsonb 列。
創建 json 字符串的代碼是
survey_data_series = scto_df.loc[int(i)]
survey_data_json_string = json.dumps(survey_data_series.to_dict())
添加到 postgresql 數據庫的代碼是:
def add_record(self, table_name, record_data):
record = getattr(self, table_name)(**record_data)
self.s.add(record)
self.s.flush()
return(record.id)
我的 JSON 在日志中正確打印
{"completiondate": "Feb 8, 2022 10:49:29 AM", "submissiondate": "Feb 8, 2022 10:49:29 AM", "starttime": "Feb 8, 2022 10:37:17 AM", "endtime": "Feb 8, 2022 10:49:21 AM", "deviceid": "ac29d854b49a49be", "subscriberid": NaN}
但是當它進入數據庫時,json 被包含在一個字符串中,並且在每個雙引號前添加了一個轉義字符。
"{\"completiondate\": \"Feb 8, 2022 10:49:29 AM\", \"submissiondate\": \"Feb 8, 2022 10:49:29 AM\", \"starttime\": \"Feb 8, 2022 10:37:17 AM\", \"endtime\": \"Feb 8, 2022 10:49:21 AM\", \"deviceid\": \"ac29d854b49a49be\", \"subscriberid\": NaN}"
因此,以下查詢均無效:
SELECT JSON_EXTRACT_PATH_TEXT(survey_data_json::json,'starttime') AS starttime
FROM "Suvita".survey_data_json;
SELECT survey_data_json -> 'starttime' AS starttime
FROM "Suvita".survey_data_json;
SELECT (survey_data_json -> 0)--> '\"starttime\"' AS starttime
FROM "Suvita".survey_data_json; --Gives the whole json string
SELECT * FROM "Suvita".survey_data_json where survey_data_json->>'deviceid'='ac29d854b49a49be';
我的要求是能夠通過匹配鍵值來查詢 JSON 列。 請幫忙
已解決:我編輯了代碼以將字典直接傳遞給 sqlalchemy 表 object 以添加行。 它自動將字典轉換為 JSON。
record=self.survey_data_json(surveyid=surveyid,survey_data_json=dict_object)
self.s.add(record)
謝謝@snakecharmerb
默認情況下,SQLAlchemy 將在分配給 JSON 或json.dumps
列的值上自動調用 json.dumps,因此實際上沒有必要對問題進行編碼,因為它會導致您自己將其稱為 double
用於編碼和解碼 JSON 的函數可以通過將json_serializer和json_deserializer arguments 設置為create_engine
來管理
如果您不希望 SQLAlchemy 自動序列化,請傳遞一個身份 function ,例如lambda x: x
。
import json
import sqlalchemy as sa
from sqlalchemy.dialects.postgresql import JSONB
engine = sa.create_engine('postgresql+psycopg2:///test', future=True)
engine2 = sa.create_engine(
'postgresql+psycopg2:///test', future=True, json_serializer=lambda x: x
)
tbl = sa.Table(
't73387703',
sa.MetaData(),
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('data', JSONB),
)
tbl.drop(engine, checkfirst=True)
tbl.create(engine)
d = {'a': 1, 'b': 2}
ins = tbl.insert()
with engine.begin() as conn:
conn.execute(ins.values(data=json.dumps(d)))
conn.execute(ins.values(data=d))
with engine2.begin() as conn:
conn.execute(ins.values(data=json.dumps(d)))
test# select * from t73387703 order by id;
id │ data
════╪════════════════════════
1 │ "{\"a\": 1, \"b\": 2}"
2 │ {"a": 1, "b": 2}
3 │ {"a": 1, "b": 2}
(3 rows)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.