【发布时间】: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