【问题标题】:What is wrong with this row insertion?这个行插入有什么问题?
【发布时间】: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() 提供参数。

标签: python mysql pymysql


【解决方案1】:

正如 Klaus 已经写的那样,不要使用搅拌插入使用占位符。

喜欢

statement = "INSERT INTO Machine_status (timestamp, num_of_char, STATUS,    emergency_status) VALUES (%s,%s,%s,%s)"
dbCursor.execute(statement,(timestamp,num_of_char,status,emergency_status))

【讨论】:

  • 这实际上是我尝试的第一件事。很高兴知道无论如何我都想更改为这种格式,但不幸的是它并没有解决问题。
  • 请发布您的创建表和完整的插入字符串。此外,必须是一个错误并追溯这也会有所帮助,顺便说一句。 mysql 在内部转换所有你可以使用的 sp '%s
  • 我刚刚用更多相关代码更新了帖子,包括创建表字符串和与插入字符串相关的所有内容。同样最令人沮丧的部分是服务器没有给出任何跟踪或错误。它认识到存在异常,但我不知道如何提取该异常并显示它。我目前正在尝试弄清楚如何使用 pymysql。
  • 使用我的方法而不是 %d,我不知道你在插入什么以及你的回溯
  • 我找出了问题所在,并更新了帖子。
猜你喜欢
  • 2016-02-11
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 2011-10-19
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
相关资源
最近更新 更多