我想从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天内我们一直在解决此问题。
答案 0 :(得分:0)
您已经为MySQL正确编写了参数化查询:
sql = ("INSERT INTO debit (data_debit) VALUES (%s)")
问题是您传递了错误的参数:
val=(debit)
mycursor.execute(sql,val)
括号不能使debit
成为1值的元组。他们什么也没做。 val
与debit
相同。
但是execute
想要一个单独的值序列,而不是1个值。
要解决此问题,您需要添加一个逗号。逗号是在Python中创建元组的原因:
val = debit,
如果您想知道为什么这会引发SQL错误,而不是引发val
不可迭代的Python错误…val
很可能是字符串。字符串是可迭代的。他们只是迭代他们的角色。如果val
是'$100'
,则您要传递参数'$'
,'1'
,'0'
和'0'
以适合只有一个参数的参数化查询。