【问题标题】:Python MySQL Connector database query with %s fails使用 %s 的 Python MySQL 连接器数据库查询失败
【发布时间】:2018-12-21 14:08:47
【问题描述】:

我有一个应该查询包含用户信息的数据库的基本程序。我正在尝试为特定用户选择信息并将其打印到控制台。

这是我的代码:

import mysql.connector

funcon = mysql.connector.connect(user='root', password='pass', host='127.0.0.1', database='fundata')
funcursor = funcon.cursor()

query = ("SELECT * FROM funtable WHERE userName=%s")
uName = 'user1'

funcursor.execute(query, uName)

for (userName) in funcursor:
    print("{}".format(userName))

我将用户名存储在一个变量中,因为稍后我计划从 tkinter 输入框中获取用户名。当我执行此代码时,我收到以下错误:

mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%s' at line 1

我尝试在查询中将 %s 放在引号中,但随后它会逐字搜索用户名“%s”,但什么也不返回。如何更改我的代码,以便仅查询该用户的数据库?

谢谢。

仅供参考:我使用的是 python 3.3。

【问题讨论】:

    标签: python mysql-connector mysql-connector-python python-db-api


    【解决方案1】:

    将您的 funcursor.execute(query, uName) 呼叫更改为:

    funcursor.execute(query, (uName, ))
    

    execute 中的第二个参数采用字符串列表/元组,而不是字符串。上述调用在将字符串传递给execute 之前创建了元组,因此不会引发错误。

    execute 采用字符串列表/元组的原因是因为它事先不知道需要多少个字符串才能满足您的查询。

    【讨论】:

    • 非常感谢。这行得通。不过,您能解释一下为什么逗号是必要的吗?我尝试不使用逗号并得到相同的错误。
    • 这是因为execute 需要一个值列表或元组作为第二个参数。逗号会在现场创建一个元组,从而覆盖函数的要求。 execute 不知道在读取查询之前需要在查询中替换多少字符串,并且它不想读取您的查询两次。所以它只是询问你一个查询,然后是一个字符串列表或元组。即使你只想替换一个字符串,你也必须先把它变成一个列表或元组,然后再传入。
    • 好的。感谢您的帮助。
    • 感谢您的回答,我正在拔头发。这似乎是一个糟糕的设计决定,有一个尾随的逗号 + 空格:/
    猜你喜欢
    • 2011-12-05
    • 2016-09-24
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2017-03-08
    • 1970-01-01
    相关资源
    最近更新 更多