将JSON写入MYSQL数据库时SQL语法中的PYTHON错误

时间:2018-08-26 20:32:04

标签: python sql json

我想从MQTT接收json数据并将其存储在我的数据库中。

执行我的代码时收到此错误:

mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '%s)' at line 1

有我的代码:

import mysql.connector
import json

mydb = mysql.connector.connect(
  host="localhost",
  user="***",
  passwd="***",
  database="database"
)

mycursor = mydb.cursor()

def DATA_REPARTITION(Topic, jsonData):
 if Topic == "test":
    #print ("Start")
    INSERT_DEBIT(jsonData)




def INSERT_DEBIT(jsonData):
  #Read json from MQTT
  print("Start read data to insert") 
  json_Dict = json.loads(jsonData)
  debit = json_Dict['debit']

 #Insert into DB Table
  sql = ("INSERT INTO debit (data_debit) VALUES (%s)")
  val=(debit)

  mycursor.execute(sql,val)

  mydb.commit()

  print(mycursor.rowcount, "record inserted.")

  mycursor.close()
  mydb.close()

感谢您的帮助,最近2天内我们一直在解决此问题。

1 个答案:

答案 0 :(得分:0)

您已经为MySQL正确编写了参数化查询:

sql = ("INSERT INTO debit (data_debit) VALUES (%s)")

问题是您传递了错误的参数:

val=(debit)

mycursor.execute(sql,val)

括号不能使debit成为1值的元组。他们什么也没做。 valdebit相同。

但是execute想要一个单独的值序列,而不是1个值。


要解决此问题,您需要添加一个逗号。逗号是在Python中创建元组的原因:

val = debit,

如果您想知道为什么这会引发SQL错误,而不是引发val不可迭代的Python错误…val很可能是字符串。字符串可迭代的。他们只是迭代他们的角色。如果val'$100',则您要传递参数'$''1''0''0'以适合只有一个参数的参数化查询。