如何在 python3 中正确使用 mysql 连接器占位符 %S?

How to correctly use mysql connector placeholders %S in python3?

我正在尝试使用 python3 和 mysql.connector 读取和写入 mysql 数据库。但是,在我的合成器中使用“%s”占位符时遇到问题。考虑以下代码:

import mysql.connector

dbconfig = {"host": "xxxxx",
            "user": "xxxx",
            "password": "xxxx",
            "database": "test"}

connection = mysql.connector.connect(**dbconfig)
cursor = connection.cursor()

_SQL ="""
SELECT surname, %s, %s FROM home;
"""

cursor.execute(_SQL, ("familyname", "hungry",))
response = cursor.fetchall()
for element in response:
    print(element)

test/home 是我们家的 database/table 动物,我创造它只是为了玩这个。它有一个 id、surname、familyname 和一个表示他们有多饿的值。该代码应该基本上显示 table 中的每个条目,但我尝试使用“%s”占位符将行指定为 select。

然而这会导致一些奇怪的结果。如果我的 SQL 看起来像这样:

_SQL ="""
SELECT %s, %s, %s FROM home;
"""
cursor.execute(_SQL, ("surname","familyname", "hungry",))

我得到这样的结果:

surname, familyname, hungry
surname, familyname, hungry
surname, familyname, hungry
surname, familyname, hungry

如果我像这样混合我的代码:

_SQL ="""
SELECT surname, %s, %s FROM home;
"""
cursor.execute(_SQL, ("familyname", "hungry",))

我得到:

moor, familyname, hungry
boris, familyname, hungry
whiskey, familyname, hungry
sherry, familyname, hungry

我尝试调试,但无济于事。我唯一意识到的是,“%s”不允许使用我代替 table 名称。除此之外应该没问题。但是,硬编码的列名似乎按预期工作,但与“%s”一起使用时出现问题。

我找到了这个主题: Python MySQLdb placeholders syntax

另一位用户对这些占位符有疑问,我发现的一个有效代码示例是:

query = """UPDATE animal SET name = %s
           WHERE name = %s
           """
values = ("snake", "turtle")

cursor.execute(query, values)

除了包含在另一个变量(值)中的名称元组外,我看不出这里占位符的使用方式有何不同

所以我想知道使用这些查询占位符的正确方法是什么?

这些占位符旨在用于值(在执行时)。

如果你想改变查询(改变字段等),你应该做一些字符串操作。

看一看这个想法:

fields = ("familyname", "hungry",)

_SQL = f"""
SELECT surname, {', '.join(fields)} FROM home;
"""

print(_SQL)

cursor.execute(_SQL)

%s%(name)s 参数样式用于格式化 values.

所以这行代码:

cursor.execute('SELECT %s FROM foo', ("bar",))

给出此查询:

SELECT "bar" FROM foo

return如预期的那样是“栏”。但你想要的是:

SELECT bar FROM foo

在第一个查询中,"bar" 被解释为 return 的值,其中 bar 被解释为要获取的列。

但是这段代码:

cursor.execute('UPDATE tablename SET foo=%s WHERE bar=%s', ('foo', 'bar'))

给出这个查询:

UPDATE tablename SET foo='foo' WHERE bar='bar'

在这里,将 'foo''bar' 作为字符串很有意义,因为它是您要更新的值。