Ошибка PYTHON в синтаксисе SQL при записи json в базу данных MYSQL

1

Я хочу получать 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 дней.

  • 1
    Как журнал ошибок базы данных SQL?
  • 1
    @Denziloe Это похоже на ошибку при попытке параметризовать запрос, что делает его вопросом, связанным с Python.
Показать ещё 6 комментариев
Теги:

1 ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню