【问题标题】:Issues inserting special characters in Postgresql在 Postgresql 中插入特殊字符的问题
【发布时间】:2020-08-26 00:27:32
【问题描述】:

我测试了包含以下列的表:id:int、status:string 和 payload:jsonb

我在一个元组中有要插入到测试表中的值:

record=(1234567, 'ERROR','{"header": "Response", "status": "Err", "Details": "Replace ''Jonh''s Assoc.'' → ''Jonh''s Civil Assoc."}')

将记录传递给游标执行:

cur.execute('insert into test VALUES {};'.format(record))

执行查询后插入语句如下所示:

insert into test VALUES (1234567, 'ERROR','{"header": "Response", "status": "Err", "Details": "Replace \'\'John\'\'s Assoc.\'\' → \'\'John\'\'s Civil Assoc."}');

如果您注意到,字符串会在每个引号中添加反斜杠。所以我最终得到了以下错误:

(psycopg2.errors.SyntaxError) syntax error at or near "\"
"Details": "Example: Replace \'\'John\'\'s...
                                                             ^

我们将不胜感激。

谢谢

【问题讨论】:

  • ... "issues": [{"issue": "one": [{"Details": ...: 这不是有效的 JSON 开头。

标签: python sql postgresql sql-insert psycopg2


【解决方案1】:

在 SQL 中,一个单引号被另一个单引号转义,而不是反斜杠。我建议使用合法的query parameters,而不是python字符串格式化方法,这样数据库驱动程序可以为你正确处理转义。

cur.execute('insert into test(id, status, payload) VALUES (?, ?, ?)', record);

如果您愿意,您甚至可以单独强制转换参数(尽管这里应该没有必要):

cur.execute('insert into test(id, status, payload) VALUES (?, ?, ?::jsonb)', record);

【讨论】:

  • 得到以下错误:AttributeError: 'tuple' object has no attribute 'keys'。我已经搜索过,但我不知道这个错误。
【解决方案2】:

当格​​式化像Test String 这样的简单字符串时,将\' 添加到\'Test String\' 是正确的。但是,当将 JSON 作为字符串传递时,该字符串具有不止一层,因此添加 \' 会影响预期的语法。

因为在给定字符串中调用格式函数只是在第一级提供了正确的格式,所以更复杂的字符串会受到影响并收到\'。所以,我最终从字符串中删除了\' 以使其工作。

我不喜欢这个解决方法,但我会一直应用它直到得到更好的修复:

 cur.execute('insert into test VALUES {};'.format(record).replace("\\", "")

谢谢

【讨论】:

    猜你喜欢
    • 2019-03-09
    • 2012-03-24
    • 1970-01-01
    • 2016-11-24
    • 2023-03-10
    • 1970-01-01
    • 2011-04-19
    相关资源
    最近更新 更多