使用 postgres/Python 选择撇号

Posted

技术标签:

【中文标题】使用 postgres/Python 选择撇号【英文标题】:Apostrophe in select with postgres/Python 【发布时间】:2020-08-13 11:42:51 【问题描述】:

我正在尝试查看数据库中是否已有项目。但是我不知道如何选择其中带有撇号(')的名称。

我尝试过使用 adapt, %s(根本不起作用)。 :item 语法也不起作用。

下面的选择将导致

Exception has occurred: ProgrammingError
(psycopg2.errors.SyntaxError) syntax error at or near "s"
LINE 1: select * from items where name = 'Akunda's Bite'

# CODE
str_sql = text(f"select * from items where name = 'item_name'")

results = self.conn.execute(str_sql).fetchone()

【问题讨论】:

【参考方案1】:

不要使用 (f-) 字符串格式,而是使用 DB-API 的 parameter substitution method:

str_sql = text("select * from items where name = %s;")
results = self.conn.execute(str_sql, (item_name,)).fetchone()

注意,值必须作为序列传递;特别是tuplelist。字符串是一个序列,但字符串中的每个字符都将被解释为查询的不同值,这将导致

TypeError:字符串格式化期间并非所有参数都转换

被抚养。

【讨论】:

这不需要元组。 str_sql = "select * from items where name = %s" results = self.conn.execute(str_sql, item_name).fetchone() 那么item_name必须是元组或列表。 如果我将字符串“Akunda's Bite”作为第二个参数传递给execute,我会得到TypeError: not all arguments converted during string formatting

以上是关于使用 postgres/Python 选择撇号的主要内容,如果未能解决你的问题,请参考以下文章

在REGEX中选择引号但不是撇号

在 PHP 中,如何创建包含引号和撇号的 mySQL 选择查询?

如何使用 django ORM 在 postgres 中仅选择日期部分

正确的单撇号与撇号?

使用 Python 处理 sql 时的撇号 (') 帮助

如何匹配并返回字符串的多个实例,其中单个撇号可以包含在任何索引中?