Как создать и обновить базу данных SQL с данными в реальном времени, полученными из сокета python?

#python #database

Вопрос:

Источник данных

Я получаю данные с симулятора вождения в режиме реального времени. Ниже приведена программа сокета, которая получает данные от симулятора, а затем печатает их:

 import socket import struct  UDP_IP = "127.0.0.1" UDP_PORT = 4001  sock = socket.socket(socket.AF_INET, # Internet  socket.SOCK_DGRAM) # UDP sock.bind((UDP_IP, UDP_PORT))  while True:  data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes  fields = struct.unpack_from('=ddd', data)  print(fields[0],fields[1],fields[2])  

Выход

Печатные данные отображаются в оболочке следующим образом:

введите описание изображения здесь

Что я хочу сделать

Я хочу сохранить эти данные в базе данных. Позже я хочу использовать базу данных в приложении. Мой вопрос: как мне создать базу данных, которая может хранить и сохранять эти данные в реальном времени? У меня нет предварительных знаний о создании баз данных. Пожалуйста, расскажите мне о соответствующих ресурсах.

Что я пробовал:

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

Создание базы данных:

 import sqlite3  conn = sqlite3.connect('test_database') c = conn.cursor()  c.execute('''  CREATE TABLE IF NOT EXISTS position  ([y] REAL PRIMARY KEY, [x] REAL, [z] REAL)  ''')     conn.commit()  

Попытка обновить базу данных данными в режиме реального времени:

Then I modified my script file to store the data in a database as follows:

 import socket import struct import sqlite3  conn = sqlite3.connect('test_database') c = conn.cursor()  UDP_IP = "127.0.0.1" UDP_PORT = 4001  sock = socket.socket(socket.AF_INET, # Internet  socket.SOCK_DGRAM) # UDP sock.bind((UDP_IP, UDP_PORT))  while True:  data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes  fields = struct.unpack_from('=ddd', data)  #print("received message:", data)  print(fields[0],fields[1],fields[2])  #sock.sendto(fields.encode(), ("127.0.0.1",7070))    c.execute('''  INSERT INTO position (y, x, z)   VALUES  (fields[0],fields[1], fields[2])  ''')  conn.commit()  

Ошибка:

Но я получаю следующую ошибку:

 2315.259850934807 35025.972653539255 -1.7375892216255708 Traceback (most recent call last):  File "C:NadsMiniSim_2.3bin.x64testIP-UDP3.py", line 22, in lt;modulegt;  c.execute(''' sqlite3.OperationalError: near "[0]": syntax error  

Я не уверен, что пошло не так. Пожалуйста, веди меня.

Комментарии:

1. Рекомендуется, чтобы вы, по крайней мере, попытались сделать то, что вы хотели бы сделать, и люди здесь могут направить вас, если у вас возникнут какие-либо проблемы. Должно быть по крайней мере тысячи других вопросов SO о создании и заполнении базы данных из Python.

2. @mechanical_meat, теперь я обновил свой вопрос тем, что я пробовал. Не могли бы вы, пожалуйста, взглянуть?

Ответ №1:

Правильный синтаксис для вставки данных в таблицу sqlite с использованием заполнителей

 c.execute(  'INSERT INTO position (y, x, z) VALUES (?, ?, ?)',  (fields[0], fields[1], fields[2]), )  

т. е. используйте ? вместо значения, а затем передайте это количество значений в качестве кортежа.

Другой вариант-использовать именованные заполнители:

 c.execute(  'INSERT INTO position (y, x, z) VALUES (:y, :x, :z)',  {'y': fields[0], 'x': fields[1], 'z': fields[2]}, )  

Комментарии:

1. Большое спасибо.