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

如何让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 tenacity
    
    修改写入函数:
    from 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:12:32