Я хочу получать json-данные из MQTT и хранить их в моей базе данных.
Когда я выполняю мой код, я получаю эту ошибку:
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 дней.
Вы правильно создали свой параметризованный запрос для 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, вместо ошибки Python о том, что val
не является итерируемым... Скорее всего, val
является строкой. И строки повторяемы. Они просто перебирают своих персонажей. Если val
, скажем, '$100'
, то вы передаете аргументы '$'
, '1'
, '0'
и '0'
, чтобы соответствовать параметризованному запросу только с одним параметром.