如何让Raspberry Pi 3向远程PostgreSQL数据库写入并修改数据
解决方案:树莓派3通过Python将能耗数据实时写入远程PostgreSQL
Hey Carl, 刚好我之前做过类似的物联网数据采集+远程数据库存储的项目,给你梳理几个关键步骤,应该能帮你快速实现需求:
1. 安装Python的PostgreSQL驱动
Python连接PostgreSQL最常用的库是psycopg2,在树莓派上直接安装可能会遇到编译依赖问题,推荐安装预编译的binary版本,省心很多:
pip3 install psycopg2-binary
2. 配置远程PostgreSQL的访问权限
这一步很容易踩坑,必须确保远程数据库允许树莓派的IP访问:
- 登录你的远程PostgreSQL服务器,找到
pg_hba.conf文件(通常在/var/lib/postgresql/[版本号]/main/目录下),添加一条访问规则:host 你的数据库名称 你的数据库用户名 树莓派的公网/内网IP/32 scram-sha-256 - 重启PostgreSQL服务使配置生效:
sudo systemctl restart postgresql - 检查远程服务器的防火墙,确保开放了5432端口(PostgreSQL默认端口),并允许树莓派的IP访问。
3. 编写Python代码实现数据写入
3.1 数据库连接函数
先写一个复用的连接函数,处理连接异常:
import psycopg2 import datetime def connect_to_postgres(): try: # 替换成你的远程数据库真实信息 conn = psycopg2.connect( dbname="your_db_name", user="your_db_user", password="your_db_password", host="remote_server_ip_or_domain", port="5432" ) return conn except Exception as e: print(f"数据库连接失败: {str(e)}") return None
3.2 数据写入函数
假设你已经在远程数据库创建了存储能耗数据的表(比如表名为energy_metrics,字段包含timestamp(时间戳)、energy_value(能耗值)、device_id(设备标识)),编写数据插入函数:
def write_energy_data(energy_value, device_id): conn = connect_to_postgres() if not conn: return try: cursor = conn.cursor() # 请根据你的实际表结构调整字段和占位符 insert_sql = """ INSERT INTO energy_metrics (timestamp, energy_value, device_id) VALUES (%s, %s, %s); """ # 组装数据:当前时间戳、采集到的能耗值、设备ID data = (datetime.datetime.now(), energy_value, device_id) cursor.execute(insert_sql, data) conn.commit() print("数据写入成功") except Exception as e: print(f"数据写入失败: {str(e)}") conn.rollback() # 写入失败时回滚,避免脏数据 finally: # 不管成功失败,都要关闭游标和连接 cursor.close() conn.close()
3.3 整合到你的采集逻辑里
在原来的ModbusTCP采集循环中,每次获取到数据后调用write_energy_data()即可,比如:
import time from pymodbus.client import ModbusTcpClient # 初始化ModbusTCP客户端 client = ModbusTcpClient("你的采集硬件IP", port=502) client.connect() while True: # 采集能耗数据(根据你的硬件调整寄存器地址和参数) result = client.read_holding_registers(address=0, count=1, unit=1) if not result.isError(): # 假设寄存器值需要除以10转换为实际能耗单位 energy_value = result.registers[0] / 10 # 写入远程数据库 write_energy_data(energy_value, "raspberry_pi_3_energy_device") # 设置采集间隔,比如每10秒一次 time.sleep(10)
4. 提升稳定性的小技巧
- 添加重试机制:远程网络可能不稳定,用
tenacity库实现自动重试:
修改写入函数:pip3 install tenacityfrom tenacity import retry, stop_after_attempt, wait_exponential @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10)) def write_energy_data(energy_value, device_id): # 原有的写入逻辑 - 保留本地CSV备份:可以同时将数据写入本地CSV,避免网络故障时丢失数据,后续可以手动同步到数据库。
- 添加日志记录:用Python的
logging模块记录每次采集和写入的情况,方便后续排查问题。
5. 测试连接
先在树莓派上用psql命令测试远程连接是否正常:
psql -h remote_server_ip -U your_db_user -d your_db_name
如果能成功登录数据库,说明权限和网络配置没问题,再运行Python代码测试数据写入。
内容的提问来源于stack exchange,提问作者Carl Steel
相关产品推荐
相关产品推荐

