簡體   English   中英

Python SqlAlchemy adding escape characters to json string while inserting in postgresql json column, so queries not working

[英]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_serializerjson_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM