如何在 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'
作为字符串很有意义,因为它是您要更新的值。
我正在尝试使用 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'
作为字符串很有意义,因为它是您要更新的值。