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
相关产品推荐
相关产品推荐

