如何在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查询中传递变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将列表作为查询参数传递[重复]

使用变量作为表名并传递给另一个 sql 查询 [重复]

如何将字符串中的多个变量传递到查询中[重复]

在Python中将sql查询存储为单个变量[重复]

将带撇号的变量传递给 SQL 查询

如何在 node.js 环境中将查询语句传递给 bigquery