如何将Python Socket接收的实时数据写入并更新SQL数据库
问题原因
存在两个核心问题:
- SQL语句无法直接识别Python变量:你在INSERT语句里直接写了
fields[0]这类Python变量表达式,SQLite的SQL解析器不认识Python语法,因此抛出语法错误。 - 表结构设计不合理:你将
y字段设为主键,主键要求全局唯一,而驾驶模拟器的y坐标大概率会出现重复值,后续插入重复y值时会触发主键冲突错误。
修复方案
1. 先修正表结构
删除原有test_database文件,用以下代码重新建表,新增自增主键id和时间戳字段,方便后续时序数据查询:
import sqlite3 conn = sqlite3.connect('test_database') c = conn.cursor() c.execute(''' CREATE TABLE IF NOT EXISTS position (id INTEGER PRIMARY KEY AUTOINCREMENT, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, y REAL, x REAL, z REAL) ''') conn.commit() conn.close()
2. 修正数据插入逻辑
使用SQLite参数化查询的写法,用?作为值的占位符,将真实数据作为第二个参数传入execute方法:
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(fields[0],fields[1],fields[2]) # 参数化查询写法 c.execute('INSERT INTO position (y, x, z) VALUES (?, ?, ?)', (fields[0], fields[1], fields[2])) conn.commit()
补充说明
如果后续你的数据量增长到百万级以上,或者需要做更复杂的时序数据聚合查询,可以考虑使用专门的时序数据库,当前入门阶段SQLite完全可以满足需求。
内容的提问来源于stack exchange,提问作者umair durrani
相关产品推荐
相关产品推荐

