#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. Большое спасибо.