【发布时间】:2021-09-02 11:05:29
【问题描述】:
我正在使用 Python 中的 mySQL,并使用 PyMySQL 模块处理连接。 dbCursor 是游标对象。
我有如下声明:
statement = f"INSERT INTO Machine_status (timestamp, num_of_char, STATUS, emergency_status) VALUES ({timestamp},{num_of_char},{status},{emergency_status})"
dbCursor.execute(statement)
但是,每当我尝试执行此语句时,程序就会挂起。这很令人困惑,因为这句话与它类似:
statement = f"INSERT INTO Speed (timestamp, meters_per_second) VALUES ({timestamp}, {meters})"
dbCursor.execute(statement)
没有给出任何问题。第一个陈述有什么问题?我真的不知道它可能是什么。我检查并确保变量名称匹配,我检查了数据库中的结构以确保变量与列可以接受的内容相匹配,确保没有额外的括号并且语法正确但在尝试时它继续挂起执行语句。令人沮丧的是,尝试直接在数据库中运行语句(使用 phpMyAdmin)没有任何问题。这是怎么回事?
EDIT1:添加了更多相关代码。
EDIT2:我已经尝试将其重新格式化为使用占位符(即 VALUES (%d, %d, %s, %d))。它不能解决问题。
EDIT3:CREATE TABLE 语句
"CREATE TABLE Machine_status (id AUTO_INCREMENT PRIMARY KEY, timestamp int, num_of_char int, status varchar(255), emergency_status int)"
完整的插入字符串
payload = item[0].split("{")[1].split("}")[0].split(" ") #returns a list containing everything between brackets of statement
timestamp = int(payload[0])
num_of_char = int(payload[1])
status = payload[2]
emergency_status = int(payload[3])
statement = "INSERT INTO Machine_STATUS (timestamp, num_of_char, STATUS, emergency_status) VALUES (%d, %d, %s, %d)"
try:
dbCursor.execute(statement, (timestamp, num_of_char, status, emergency_status))
print("Complete.")
except:
print("something went wrong")
EDIT4:我弄清楚了问题所在。 pymysql 在尝试提取错误代码时遇到问题,所以我切换到 mysql.connector。它终于给了我一个“找不到表”的错误。显然我在代码中使用的表名与我在数据库中使用的不完全匹配,因此导致找不到表。我改了,现在问题消失了。
【问题讨论】:
-
不要将 f 字符串用于 SQL 查询。这会导致注入漏洞。查看数据库适配器的文档,了解如何为
execute()提供参数。