我正在为每一行运行一个非常大的数据集,其中包含一个json对象。经过近10亿行后,我的交易突然出错了。
我正在使用Python 3.x和psycopg2来执行我的交易。
我想写的json对象如下:
{"message": "ConfigManager: Config if valid JSON but doesn't seem to have the correct schema. Adopting new config aborted."}
和psycopg2报告以下内容:
syntax error at or near "t"
LINE 3: ...": "ConfigManager: Config if valid JSON but doesn't seem to ...
我知道问题是单引号,但是我不知道如何解决这个问题,以便可以将json对象传递给我的数据库。
我的json列的类型为jsonb
,名为first_row
所以,如果我尝试:
INSERT INTO "356002062376054" (first_row) VALUES {"message": "ConfigManager: Config if valid JSON but doesn't seem to have the correct schema. Adopting new config aborted."}
我仍然收到错误。我似乎没有做任何事情会解决这个问题。我尝试使用t
转义\
并将双引号更改为单个qoutes,并删除大括号。什么都行不通。
我相信我记得做
是非常重要的`json.dumps({"message": "ConfigManager: Config if valid JSON but doesn't seem to have the correct schema. Adopting new config aborted."})` in my python code and yet I am getting this problem.
答案 0 :(得分:2)
您可以使用美元符号约束或C样式转义。例如docs:
通过写字母E(上部)来指定转义字符串常量 在开头单引号之前,例如,E' foo'
那么:
INSERT INTO "356002062376054" (first_row) SELECT e'{"message": "ConfigManager: Config if valid JSON but doesn\'t seem to have the correct schema. Adopting new config aborted."}'
或
INSERT INTO "356002062376054" (first_row) values (E'{"message": "ConfigManager: Config if valid JSON but doesn\'t seem to have the correct schema. Adopting new config aborted."}');
应该适合你
答案 1 :(得分:1)
您必须将单引号翻倍以在SQL中转义它。
但是您遇到此问题意味着您的代码容易受到SQL injection的攻击。您应该使用parameterized statements并在执行语句时将字符串作为参数提供。如果你这样做,问题就会消失。
psycopg2
文档有这种可怕但有保证的警告:
警告:从不,从不,从不使用Python字符串连接(
+
)或字符串参数插值(%
)将变量传递给SQL查询字符串。甚至在枪口下也没有。