首页 > 解决方案 > 准备好的语句和不正确的参数数量

问题描述

我正在使用 SQL 查询来查找具有某个 RFID 值的所有用户,每个用户可以有多个 RFID 值。

Incorrect number of arguments executing prepared statement我创建了一个准备好的语句,这并不是真正需要的,因为插入的值应该只是数字,但是,即使我只输入一个存储在元组中的值,我也会不断收到错误消息。

变量 RFID 是函数内的参数

conn = Database.connect()  # returns an instance of connector.connect 

cursor = conn.cursor(prepared=True)  # Creates a cursor that is expecting 

sql_query = """SELECT RFID, users.UserID, FirstName, Surname, Email, Dob, Gender, Mobile 
               FROM users 
               JOIN RFIDs ON (users.UserID = RFIDs.UserID) 
               WHERE users.UserID = (SELECT UserID FROM RFIDs WHERE RFID = '%s');"""

cursor.execute(sql_query, (rfid,))  # Get user info


user_info_array = cursor.fetch()  # Store the results


conn.commit()  # Save the changes to the database

查询工作正常,因为我已经使用它并且在手动输入值时。

提前致谢

标签: pythonmysql

解决方案


您不应该在 %s 周围使用单引号

sql_query = """SELECT RFID, users.UserID, FirstName, Surname, Email, Dob, Gender, Mobile 
           FROM users 
           JOIN RFIDs ON (users.UserID = RFIDs.UserID) 
           WHERE users.UserID = (SELECT UserID FROM RFIDs WHERE RFID = %s);"""

并且正如 spencer7593 对子查询所建议的那样,应该使用 IN 子句而不是 =(等号运算符),以避免在子查询返回多于一行时出现错误

 sql_query = """SELECT RFID, users.UserID, FirstName, Surname, Email, Dob, Gender, Mobile 
       FROM users 
       JOIN RFIDs ON (users.UserID = RFIDs.UserID) 
       WHERE users.UserID IN (SELECT UserID FROM RFIDs WHERE RFID = %s);"""

或内部连接

sql_query = """SELECT RFID, users.UserID, FirstName, Surname, Email, Dob, Gender, Mobile 
   FROM users 
   JOIN RFIDs ON (users.UserID = RFIDs.UserID) 
   inner join  (
     SELECT UserID FROM RFIDs WHERE RFID = %s
   ) t on T.UserID  = users.UserID ;""" 

推荐阅读