psycopg2.ProgrammingError:语法错误

Posted

技术标签:

【中文标题】psycopg2.ProgrammingError:语法错误【英文标题】:psycopg2.ProgrammingError: syntax error 【发布时间】:2015-11-18 05:39:10 【问题描述】:

我知道有很多与此类似的问题,但我还没有找到对我有帮助的问题。

我正在使用 Python 和 psycopg2 与 PostGresQL 数据库交互。这是我的代码:

conn = psycopg2.connect(dbname=db_name, user=user_name)
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
cursor = conn.cursor()
add_query = 'CREATE ROLE %s WITH CREATEDB LOGIN PASSWORD \'%s\''
add_data = (user_name, password)
cursor.execute(add_query, add_data)

我不断收到此错误:

psycopg2.ProgrammingError: "'foo'" 或附近的语法错误 LINE 1: CREATE ROLE 'foo' WITH CREATEDB LOGIN PASSWORD ''bar''

我认为这是转义引号的问题,但我有所有我能想到的斜线和引号组合。

【问题讨论】:

【参考方案1】:

AsIs

from psycopg2.extensions import AsIs

add_query = "CREATE ROLE %s WITH CREATEDB LOGIN PASSWORD %s"
add_data = (AsIs(user), password)

角色名称是一个标识符,所以没有单引号。如果需要非法字符,可以用双引号括起来,否则就不好了。

密码是一个字符串,所以让 Psycopg 适应并转义它。

【讨论】:

请注意,这将使角色名称大小写折叠。如果您想避免这种情况,您需要对其进行标识符引用。不幸的是 psycopg2 不提供 psycopg2.extensions.QuotedString 的标识符引用变体,因此您必须编写一个或手动将任何双引号加倍。

以上是关于psycopg2.ProgrammingError:语法错误的主要内容,如果未能解决你的问题,请参考以下文章

psycopg2.ProgrammingError:“st”或附近的语法错误\r,

psycopg2.ProgrammingError:列 cons.consrc 不存在

psycopg2.ProgrammingError:无法在 odoo 14 中调整类型“NewId”

Python支持SQL数据库返回psycopg2.ProgrammingError:在尝试删除表中的数据时,关系不存在错误?

psycopg2转义字符问题

psycopg2 将参数传递给 SQL 编程错误