【问题标题】:How do I pass a variable in an SQL query in python [duplicate]如何在python的SQL查询中传递变量[重复]
【发布时间】: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"
  • 如果您单独传递查询参数,则不需要在 %s 周围加上引号。

标签: python mysql sql rdbms


【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多