将字符串输入PostgreSQL会导致单引号出现语法错误

时间:2017-01-31 09:47:47

标签: python json postgresql syntax-error psycopg2

我正在为每一行运行一个非常大的数据集,其中包含一个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.

2 个答案:

答案 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查询字符串。甚至在枪口下也没有。