如何在python的SQL查询中传递变量[重复]
Posted
技术标签:
【中文标题】如何在python的SQL查询中传递变量[重复]【英文标题】:How do I pass a variable in an SQL query in python [duplicate] 【发布时间】:2021-08-11 14:29:01 【问题描述】:nameEnt = nameEntered.get()
print(nameEnt)
sql = "SELECT * FROM attendance WHERE name="%s"
val = (nameEnt)
print(mycursor.execute(sql, val))
myresult = mycursor.fetchall()
for x in myresult:
print(x)
我想使用 python 将 'nameEnt' 中的字符串传递到 SQL 查询中。我目前正在使用 mysql-connector 包。该程序一直告诉我我的语法不正确。我可以直接在 SQL 中执行查询,没有任何问题。
我也试过
sql = "SELECT * FROM attendance WHERE name= "+nameENt
【问题讨论】:
您的"
有问题... 语法高亮会给您一个提示。 ;) 试试:"SELECT * FROM attendance WHERE name=%s"
看看official docs
如果您单独传递查询参数,则不需要在 %s
周围加上引号。
【参考方案1】:
除非您知道自己在做什么,否则不要将 SQL 字符串与数据结合起来。这样做是获得SQL injection vulnerability 的可靠方法。
您的原始代码几乎是正确的。首先,正如 cmets 所指出的,您不需要 %s
周围的引号:
sql = "SELECT * FROM attendance WHERE name=%s"
那么,cursor.execute()
的第二个参数是一个元组,但在 Python 中,要创建一个单元素元组,将其括在括号中是不够的:
my_element = 12345
not_a_tuple = (my_element)
type(not_a_tuple) == int
real_tuple = (my_element,) # note the comma at the end
type(real_tuple) == tuple
将这些应用到您的代码中,您会得到:
nameEnt = nameEntered.get()
print(nameEnt)
sql = "SELECT * FROM attendance WHERE name=%s"
val = (nameEnt,)
print(mycursor.execute(sql, val))
myresult = mycursor.fetchall()
for x in myresult:
print(x)
【讨论】:
【参考方案2】:你可以试试:
sql = "SELECT * FROM attendance WHERE name = %s",(nameEnt)
或者:
sql = "SELECT * FROM attendance WHERE name = ".format(nameEnt)
【讨论】:
以上是关于如何在python的SQL查询中传递变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章