【问题标题】:Sytnax issue in SQL query written in Python用 Python 编写的 SQL 查询中的语法问题
【发布时间】:2018-11-28 07:42:10
【问题描述】:

我的闲置代码旨在提取一些传感器数据并插入到 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')

数据被正确提取(这是打印语句的目的),但我在 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 语法中(我也不太熟悉),但我找不到它。
谢谢你的建议。

EDIT** 问题的根本原因是它在 INSERT 查询中用 (') 符号弄乱了 (`)。

【问题讨论】:

  • INSERT INTO %s 表名无法参数化。您需要使用字符串插值或连接。

标签: python mysql sql syntax


【解决方案1】:

正如Lukasz Szozda所说的表名不能是参数,见Table name as variable,还需要加'包裹%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))

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

【讨论】:

  • 为什么表名不能是参数?你能链接到相关文档吗?
  • 我已将表名更改为硬编码,但问题仍然存在。也许这取决于变量 data.unit,因为错误消息恰好以该变量结束。您还有其他建议吗?
  • @ГеоргиНяголов 您是否尝试将' 添加到值中?
【解决方案2】:

我也遇到了同样的问题,终于找到根本原因是:

日期时间值应该是 string -> 用引号括起来,例如 "datetime_value"'datetime_value'

所以,你的代码应该:

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'

最好改为使用反引号作为表名:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-13
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多