用Python编写的SQL查询中的Sytnax问题

用Python编写的SQL查询中的Sytnax问题,python,mysql,sql,syntax,Python,Mysql,Sql,Syntax,我有一个休闲代码,目的是提取一些传感器数据并插入到MySQL数据库中 def sendDataToDB(con, data, table): cur = con.cursor() cur.execute("INSERT INTO %s (`sensor_id`, `value`, `unit`, `datetime`) VALUES (%s, %s, %s, %s)", (table, data.uuid, data.value, data.unit, data.datetime

我有一个休闲代码,目的是提取一些传感器数据并插入到MySQL数据库中

def sendDataToDB(con, data, table):
    cur = con.cursor()
    cur.execute("INSERT INTO %s (`sensor_id`, `value`, `unit`, `datetime`) VALUES (%s, %s, %s, %s)", (table, data.uuid, data.value, data.unit, data.datetime))
    con.commit()

temperatureSens = TemperatureSensor(0, 'temperature', 'celsius')
con = connector.Connect(user = db_user_name, password = db_password, database = db_name, host = db_host, port = db_port)

temp = temperatureSens.extractData()
print(temp.uuid, temp.value, temp.unit, temp.datetime)
sendDataToDB(con, temp, 'temperature_data')
数据被正确提取这是print语句的目的,但是我在INSERT查询的语法中有一个错误,我真的找不到。有一个错误:

mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your
SQL syntax; check the manual that corresponds to your MySQL server version for
the right syntax to use near ''temperature_data' ('sensor_id', 'value', 'unit',
'datetime') VALUES (0, 23.0, '' at line 1
我确信问题出在python语法中,我与之不太相似,但我找不到它。 谢谢你的建议

编辑**根本原因是插入查询中的“签名”错误。

正如Lukasz Szozda所说,表名不能是参数,请参见,您还需要添加“包装%s,因此更改”

 cur.execute("INSERT INTO %s (`sensor_id`, `value`, `unit`, `datetime`)
 VALUES (%s, %s, %s, %s)",
 (table, data.uuid, data.value, data.unit, data.datetime))


我也遇到过同样的问题,最终发现根本原因是:

datetime值应为string->wrap by quote,如datetime\u值或“datetime\u值”

因此,您的代码应该:

cur.execute("INSERT INTO %s (`sensor_id`, `value`, `unit`, `datetime`) VALUES (%s, %s, %s, %s)", (table, data.uuid, data.value, data.unit, data.datetime))
哪个日期时间值类似于2019-01-02 15:08:59.490163

应改为:

cur.execute("INSERT INTO %s (`sensor_id`, `value`, `unit`, `datetime`) VALUES (%s, %s, %s, '%s')", (table, data.uuid, data.value, data.unit, data.datetime))
哪个日期时间值类似于“2019-01-02 15:08:59.490163”

最好改为,对tablename使用backtick:

cur.execute("INSERT INTO `%s` (`sensor_id`, `value`, `unit`, `datetime`) VALUES (%s, %s, %s, '%s')", (table, data.uuid, data.value, data.unit, data.datetime))

无法参数化插入%s表名。您需要使用字符串插值或串联。为什么表名不能是参数?你能链接到相关的文档吗?@FHTMitchell看到了吗?我已经将表名更改为硬编码的,但问题仍然存在。也许这取决于变量data.unit,因为错误消息正是在该变量处结束的。您还有其他建议吗?@ГБББПППППППББББööööц有没有尝试增加“价值”?
cur.execute("INSERT INTO `%s` (`sensor_id`, `value`, `unit`, `datetime`) VALUES (%s, %s, %s, '%s')", (table, data.uuid, data.value, data.unit, data.datetime))