【问题标题】:Read data from a serial device using Python and save it to PostgreSQL using a Raspberry Pi使用 Python 从串行设备读取数据并使用 Raspberry Pi 将其保存到 PostgreSQL
【发布时间】:2016-06-24 10:54:29
【问题描述】:

我正在尝试从具有 FTDI 芯片的智能电表读取数据。编写了一个简单的 Python 串行程序将命令传递给仪表,仪表回复。然后将来自仪表的数据转换为浮点数并存储在字典中。

现在我想将字典存储到数据库中,这是将数据放入表中的代码。

import psycopg2

conn = psycopg2.connect(database="smartmeter", user="postgres", password="12345", host="localhost", port="5432")

cur = conn.cursor()

cur.execute('''CREATE TABLE metertable (ID      SERIAL  PRIMARY KEY     NOT NULL,meter  TEXT    NOT NULL,temperature    TEXT    NOT NULL,freq   TEXT    NOT NULL,penergy        TEXT    NOT NULL,qenergy    TEXT    NOT NULL,senergy        TEXT    NOT NULL,cospi  TEXT    NOT NULL,irms   TEXT    NOT NULL,ppower TEXT    NOT NULL,qpower TEXT    NOT NULL,spower TEXT    NOT NULL);''')
while 1:
    data=dict[]
    data={
                'time':timestamp,
                'meter':m0_data,
                'temperature':m1_data,
                'freq':m2_data,
                'penergy':m3_data,
                'qenergy':m6_data,
                'senergy':m7_data,
                'cospi':m11_data,
                'irms':m15_data,
                'vrms':m16_data,
                'ppower':realpower,
                'qpower':reactivepower,
                'spower':apparentpower
        }
        cur.executemany ("""INSERT INTO metertable(time,meter,temperature,freq,penergy,qenergy,senergy,cospi,irms,vrms,ppower,qpower,spower) VALUES (%(time)s, %(meter)s), %(temperature)s), %(freq)s), %(penergy)s), %(qenergy)s), %(senergy)s), %(cospi)s), %(irms)s), %(vrms)s), %(ppower)s) %(qpower)s) %(spower)s)""", data)

我收到这样的错误

Traceback (most recent call last):
  File "metercmd.py", line 97, in <module>
    cur.executemany("""INSERT INTO metertable(time,meter,temperature,freq,penergy,qenergy,senergy,cospi,irms,vrms,ppower,qpower,spower) VALUES (%(time)s, %(meter)s), %(temperature)s), %(freq)s), %(penergy)s), %(qenergy)s), %(senergy)s), %(cospi)s), %(irms)s), %(vrms)s), %(ppower)s) %(qpower)s) %(spower)s)""", data)
TypeError: string indices must be integers, not str

我是否朝着正确的方向向数据库输入数据?请提出一些最好的方法。

【问题讨论】:

  • 我确实认为您正朝着正确的方向前进(当然还有其他方法可以做到这一点)。无论如何,您的错误很清楚地表明您的格式有问题。干杯。
  • initd.org/psycopg/docs/…SQL = "INSERT INTO authors (name,value) VALUES (%s,%s);"; # Note: no quotes # data = ("O'Reilly", 123 ) # cur.execute(SQL, data)

标签: python postgresql raspberry-pi psycopg2 ftdi


【解决方案1】:

错误提示:您尝试推送到数据库的某些字段是字符串字段,但您推送的是整数值。

确保您的数据值与您的数据库表字段匹配。

【讨论】:

  • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
  • 感谢您的解释。不会再犯同样的错误了。
【解决方案2】:

你有多余的右括号和缺少逗号:

cur.executemany ("""
    INSERT INTO metertable(
        time,meter,temperature,freq,penergy,qenergy,senergy,cospi,irms,vrms,ppower,qpower,spower
    ) VALUES (
        %(time)s, %(meter)s, %(temperature)s, %(freq)s, %(penergy)s, %(qenergy)s, %(senergy)s,
        %(cospi)s, %(irms)s, %(vrms)s, %(ppower)s, %(qpower)s, %(spower)s
    )
""", data)

【讨论】:

    【解决方案3】:

    感谢您的帮助。错误在于executemany。我使用 type(variable) 来获取变量类型并在那些表中进行了更改,我将其更改为 cur.execute。但是当我运行代码时。我的数据库中没有数据保存。 这里是代码

    import serial
    import psycopg2
    
    port=serial.Serial("/dev/ttyUSB0",baudrate=9600,timeout=.1)
    
    conn =psycopg2.connect(database="smartmeternode",user="postgres",password="amma",host="localhost",port="5432")
    cur=conn.cursor
    data2=dict()
    while 1:
       port.write('m0\r')
       meter=port.read()
       port.write('m2\r')
       temp=port.read()
       ph=meter*temp
       time=timestamp
       data={'meter':meter,'temp':temp,'ph':ph,'time':time}
       cur.execute("INSERT INTO METERDATATEST(meter,temp,ph,time) VALUES(%(meter)s,%(temp)s,%(ph)s,%(time)s;",data)
       cur.commit
    cur.close
    conn.close
    

    程序将运行无限时间,我使用 ctrl+Z 停止程序。当我检查数据库时它仍然是空的。我错过了什么?我希望从我的智能仪表读取数据后立即将数据存储在 PSQL 数据库中

    psql smartmeternode -U postgres
    smartmeternode=# SELECT * FROM meterdatatest;
    id | meter | temp | ph | time 
    ----+-------+------+----+------
    (0 rows)
    

    【讨论】:

    • 你为什么要把这个放在答案中?使用任何更新和结果编辑您的原始问题
    猜你喜欢
    • 2017-10-28
    • 1970-01-01
    • 2020-05-08
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2021-03-23
    相关资源
    最近更新 更多