Rithikvg Ответов: 1

Поддержка необходимых данных в SQL Server через raspbeery Пи


Dear All,
I have a problem while data logging in SQL server. We are not able to do it. When we are running the python code in raspberry pi we are getting the following error msg. 


Please anyone help me out. 


Что я уже пробовал:

Python program :
import serial
import time
import MySQLdb as mdb
arduino = serial.Serial("/dev/ttyACM0")
arduino.baudrate=9600
data = arduino.readline()
time.sleep(1)
data = arduino.readline()
pieces = data.split("\t")
temperature = pieces[0]
humidity = pieces[1]
con = mdb.connect('localhost', 'root', '12345678', 'testdb');
with con:
     cursor = con.cursor()
    cursor.execute("""INSERT INTO TempDB VALUES('',%s, %s)""", (temperature,humidity))
    con.commit()
    cursor.close()
  
Error message: 
 Traceback (most recent call last):
  File "./insertDB.py", line 21, in <module>
    cursor.execute("""INSERT INTO TempDB VALUES('',%s, %s)""", (temperature,humidity))
  File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 250, in execute
    self.errorhandler(self, exc, value)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
    raise errorvalue
_mysql_exceptions.OperationalError: (1366, "Incorrect integer value: '' for column `testdb`.`TempDB`.`ID` at row 1") 

1 Ответов

Рейтинг:
0

Garth J Lancaster

1) это действительно полезно, если вы задаете вопрос, связанный с БД или одной таблицей в БД, что вы предоставляете схему - иначе на самом деле это немного догадка (вы могли бы & должны использовать "улучшить вопрос", чтобы обновить свой вопрос)

2) то, что я вижу сразу, - это это утверждение

cursor.execute("""INSERT INTO TempDB VALUES('',%s, %s)""", (temperature,humidity))
имеет три значения, но я подозреваю, что ваша таблица имеет столбец autoincrement ID в качестве первого столбца, а затем поля для температуры и влажности - так что вам не нужно пустое поле в начале значений (но см. пункт 1, Почему это может быть предположением)

3) хотя кажется, что писать SQL таким образом "легко", это не в долгосрочной перспективе - это риск для безопасности для начала ... вам действительно нужно написать параматериализованное заявление ...
with con:
  cursor = con.cursor(prepared=True)
  sql_insert_query = """ INSERT INTO TempDB (temperature, humidity) VALUES (?,?)"""

  insert_tuple = (temperature, humidity)
  cursor.execute(sql_insert_query, insert_tuple)
  con.commit()


Как уже было сказано, Я должен был принять ваши имена столбцов - смотрите, как я указываю имена столбцов в запросе insert, это означает, что любой, кто читает ваш код позже, знает, а не догадывается, куда все идет - иногда быть явным лучше - достаточно легко изменить имена. Эти ссылки ниже также могут помочь в будущем

Лучшая практика для SQL - операторов в Python- b.telligent[^] (См. раздел "наилучшая практика: параметризованные запросы").)

https://pynative.com/python-mysql-execute-parameterized-query-using-prepared-statement/[^]


Rithikvg

Спасибо за ваш ответ. Я хочу обновить значения в одной таблице внутри БД.
Я попробовал с помощью руководства youtube. Я видел Auto_Increment в столбце имя столбца " Extra ". Но я не смог узнать имя столбца "Extra" при создании таблицы. Так что я не заполнил Auto_increment. Пожалуйста помогите мне создать Auto_increment в столбце Name Extra

Garth J Lancaster

пожалуйста, измените свой ответ, чтобы включить инструкцию create, используемую для создания таблицы (которая должна содержать подробные сведения) - я не знаю, как вы ожидаете, что мы выясним, на какое "руководство youtube" вы ссылаетесь, фактически не предоставляя его, и большинство " нас " все равно не будут смотреть какую-то случайную ссылку youtube

Rithikvg

Привет,
Спасибо за ваш ответ. Я пытался использовать твой код. Но я получаю следующую ошибку msgTraceback (самый недавний призыв последнего):
Файл "./insertDB.py", строка 20, in <module>
курсор = связи.курсор(подготовлен=истина)
NameError: имя 'connection' не определено

Garth J Lancaster

Мой интервал был плохим, и вам нужно заменить "соединение" на " кон " ... так что я думаю, что ваш должен выглядеть так

with con:
  cursor = con.cursor(prepared=True)
  sql_insert_query = """ INSERT INTO TempDB (temperature, humidity) VALUES (?,?)"""
  
  insert_tuple = (temperature, humidity)
  cursor.execute(sql_insert_query, insert_tuple)
  con.commit()


Вы должны быть готовы немного поэкспериментировать и протестировать

Rithikvg

дорогой друг,
Извините, что беспокою вас, но все же я получил следующую ошибку msg
Обратная трассировка (самый недавний призыв последнего):
Файл "./insertDB.py", строка 19, in <module>
курсор = кон.курсор(подготовлен=истина)
Ошибку TypeError: курсор() приготовил неожиданный аргумент сайта''

Garth J Lancaster

похоже, что ваш слой БД отличается ? древний .. попробуйте замаскировать его, и учитывая это, вам, возможно, придется изменить оператор insert на

with con:
  //cursor = con.cursor(prepared=True)
  sql_insert_query = """ INSERT INTO TempDB (temperature, humidity) VALUES (%s,%s)"""
  
  insert_tuple = (temperature, humidity)
  cursor.execute(sql_insert_query, insert_tuple)
  con.commit()

Rithikvg

дорогой друг,
Спасибо за вашу любезную поддержку. Но все же я получаю следующую ошибку msg
//cursor = con.cursor(prepared=True)
^
SyntaxError: недопустимый синтаксис

Garth J Lancaster

просто удалите эту строку