python - 准备好的语句和不正确的参数数量
问题描述
我正在使用 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
查询工作正常,因为我已经使用它并且在手动输入值时。
提前致谢
解决方案
您不应该在 %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 ;"""
推荐阅读
- javascript - axios 获取响应未定义
- git - Git diff 所有本地未提交的更改
- python - 如何从不同位置导入机器人文件
- python - 找到从列表中对每个整数求和获得的最小和
- ruby-on-rails - 使用 2 个 if 语句与 if/elsif?为什么一个有效而另一个无效
- api - 加载资源失败:net::ERR_CONNECTION_RESET
- ibm-cloud - IBM Watson Assistant:对话中的实体重叠问题
- sql-server - 如何插入参数和声明存储过程
- python - 在 python 中使用 Mockito 模拟方法
- reactjs - 如何在组件渲染内对条件(分支)进行单元测试(返回前)