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

Python读取COM口数据插入PostgreSQL的变量传递问题求助

解决Python读取COM口数据插入PostgreSQL的变量传递问题

可能的问题根源

  • 解析后的COM口数据是字符串类型,未转换为数据库字段对应的类型(比如name是整数、temp/humidity是浮点数)
  • 参数传递格式不符合PostgreSQL驱动(如psycopg2)的要求
  • 拆分数据时未处理多余的空白字符(如换行符、空格)

解决方案步骤

1. 正确解析并转换COM口数据

先处理COM口输出的原始数据,去除空白并转换为对应数据类型:

import serial

# 初始化串口(替换为你的COM口和波特率)
ser = serial.Serial('COM3', 9600, timeout=1)
# 读取并解码数据,去除首尾空白(含换行符)
raw_data = ser.readline().decode('utf-8').strip()
ser.close()

# 拆分数据并转换类型
data_parts = raw_data.split(',')
if len(data_parts) >= 3:
    # 按数据库字段类型转换:name为整数,temp/humidity为浮点数
    name_val = int(data_parts[0])
    temp_val = float(data_parts[1])
    humidity_val = float(data_parts[2])
else:
    print("COM口数据格式错误,无法拆分出所需字段")
    exit()

2. 使用参数化查询插入数据库

用psycopg2的参数化查询方式传递变量,避免SQL注入同时保证格式正确,time字段直接用PostgreSQL的NOW():

import psycopg2

# 连接数据库(替换为你的数据库信息)
conn = psycopg2.connect(
    dbname="your_db_name",
    user="your_user",
    password="your_password",
    host="localhost",
    port="5432"
)
cur = conn.cursor()

# 参数化INSERT语句,%s为占位符
insert_sql = """
INSERT INTO datalog (name, temp, humidity, time)
VALUES (%s, %s, %s, NOW())
"""

# 以元组形式传递参数
cur.execute(insert_sql, (name_val, temp_val, humidity_val))

# 提交事务并关闭连接
conn.commit()
cur.close()
conn.close()

3. 调试与问题排查

  • 打印转换后的变量信息,确认类型和值正确:
print(f"name: {name_val} 类型: {type(name_val)}")
print(f"temp: {temp_val} 类型: {type(temp_val)}")
print(f"humidity: {humidity_val} 类型: {type(humidity_val)}")
  • 捕获数据库异常,获取详细错误信息:
try:
    cur.execute(insert_sql, (name_val, temp_val, humidity_val))
    conn.commit()
except psycopg2.Error as e:
    print(f"数据库错误详情: {e}")
    conn.rollback()

关键注意事项

  • 禁止用字符串拼接SQL语句(如f"INSERT ... VALUES ({name_val})"),会引发SQL注入风险和类型格式错误
  • 确保datalog表的字段类型与变量匹配:name为INT类型,temp/humidity为FLOAT或NUMERIC类型
  • 必须调用conn.commit()提交事务,否则数据不会写入数据库

内容的提问来源于stack exchange,提问作者Justin Barkby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 18:55:04