【问题标题】:Not all parameters were used in the SQL statement (Python, MySQL)并非所有参数都在 SQL 语句中使用(Python、MySQL)
【发布时间】:2013-12-28 18:56:37
【问题描述】:

以下 Python 代码出现错误:

import mysql.connector
cnx = mysql.connector.connect(user='root', password='',
                          host='127.0.0.1',
                          database='DB')
cursor = cnx.cursor()

Name = "James"
Department = "Finance"
StartYear = 2001
CurrentPos = 2001
Link = ""

add_user = ("INSERT INTO DB.tbluser "
       "(username, department, startyear, currentpos, link) "
       "VALUES (%s, %s, %d, %d, %s)")
data_user = (Name, Department, StartYear, CurrentPos, Link)
cursor.execute(add_user, data_user)
cnx.commit()
cursor.close()
cnx.close()

错误信息是

mysql.connector.errors.ProgrammingError: Not all parameters were used in the SQL statement

你明白为什么吗?

【问题讨论】:

  • 要在准备好的语句中使用? 而不是%x 你可以cursor = cnx.cursor(prepared=true)

标签: python mysql sql


【解决方案1】:

参数标记是%s 而不是%d

add_user = """INSERT INTO DB.tbluser 
              (username, department, startyear, currentpos, link) 
              VALUES (%s, %s, %s, %s, %s)"""

请注意,mysql.connector 使用的 parameter markers 可能看起来与 Python 字符串格式中使用的 %s 相同,但这种关系只是巧合。一些数据库适配器,如oursqlsqlite3 使用? 作为参数标记而不是%s

【讨论】:

  • 我认为它们会是 %d,因为它们是数字。但是在使用 %s 甚至删除两个年份变量时仍然会出现同样的错误。
  • 这真的很好奇。要进行调试,您可以停止mysqld 服务器,然后在启用日志记录的情况下重新启动它:mysqld --log=/path=/to/myquery.log。重新运行该脚本,然后查看/path/to/myquery.log 内部以查看正在发送到服务器的 SQL 语句。这应该给我们一个关于出了什么问题的线索。
  • 非常感谢!重新启动服务器似乎已经完成了工作...抱歉浪费您的时间!
【解决方案2】:

好的,这是我的解决方案:

%d 必须是 %s 的

''' 适用于多行,行首的 +" 和行尾的 "\ 但这不是这里的问题

我有时会发现 cursor.execute(query, values) 或者在你的情况下 cursor.execute(add_user, data_user) 有时有问题。所以我将值直接附加到查询中。

您首先将 data_user 移到 add_user 上方。然后在查询字符串的末尾添加 %values(在您的情况下为 %data_user)。这将允许您在 cursor.exec(add_user) 命令之前执行一个漂亮的小 print(add_user) 以查找其他错误。


        import mysql.connector

        cnx = mysql.connector.connect(
              user='root', 
              password='',
              host='127.0.0.1',
              database='DB')

        cursor = cnx.cursor()

        Name = "James"
        Department = "Finance"
        StartYear = 2001
        CurrentPos = 2001
        Link = ""

        data_user = (Name, Department, StartYear, CurrentPos, Link)

        add_user = '''(INSERT INTO DB.tbluser 
        (username, department, startyear, currentpos, link) 
        VALUES (%s, %s, %s, %s, %s))'''%data_user


        cursor.execute(add_user)
        cnx.commit()
        cursor.close()
        cnx.close()

【讨论】:

    【解决方案3】:

    add_user = '''("INSERT INTO DB.tbluser" “(用户名、部门、​​开始年份、当前位置、链接)” "VALUES (%s, %s, %s, %s, %s)")'''

    => 你正在使用多行语句,所以在这里使用三个单引号 并使用 %s 将传递值表示为字符串然后这将起作用,因为 mysql 不支持 %d 传递值

    【讨论】:

    • 不清楚您要做什么。您是否尝试使用此 SQL 查询插入单行或多行?你在哪里使用这个查询?与 IDE 一起使用还是在 IDE 中?您可以像下面这样修改您的代码,添加参数并执行 SQL sql = "INSERT INTO DB.tbluser (username, department, startyear, currentpos, link) VALUES ('full name', 'new dept', '2020' ,'xyz')"
    【解决方案4】:
    import mysql.connector
    
    def login(self,name,password):
        db = mysql.connector.connect(host="localhost",user="root",passwd="Cyber@123",database="mydata")
        if(db):
            print("connection successfull")
        else:
            print("faild")
        query = db.cursor()
        syntext = """insert into login(use_name,psd) values(%s,%s)"""
        value = (name,password)
        query.execute(syntext,value)
        db.commit()
    

    【讨论】:

    • 如果您能简要解释一下您的解决方案为何/如何工作,可能会更有帮助。
    【解决方案5】:

    使用单引号

    sql = 'insert into Student (id, fname, lname, school) values(%s, %s, %s , %s)'
    values = (4, "Gaddafi", "Adamu", "Informatic")
    
    a.execute(sql, values)
    
    mydb.commit()
    print(a.rowcount, "record inserted.")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 1970-01-01
      • 2017-07-25
      • 1970-01-01
      • 2021-03-03
      • 2016-04-04
      • 2019-09-09
      相关资源
      最近更新 更多