You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 09:15:04