繁体   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