当我运行我的脚本时,我正在将重复条目清理到数据库中,并且我在想我可能会做错什么。将重复的数据存储到数据库中
硬件
我有115,200通过串行通信连接到我的树莓派的工具。仪器每秒输出一行数据,我想将这些数据存储到数据库中。每行都以\ n结尾。
软件
的Python 2.7.3rc2
PySerial
的PostgreSQL 9.1
Debian的喘息
的数据库一个表叫我创建wattsup:
CREATE TABLE wattsup (
wattsuplocation text
wattsuptime timestamp
wattsupvalue numeric
);
我的Python脚本看起来如:
import serial
import time
import psycopg2
ser = serial.Serial('/dev/ttyUSB0', 115200)
Location = 'A'
conn = psycopg2.connect("dbname='mydb' user='thotchi'")
cur = conn.cursor()
Insert = "INSERT INTO wattsup (wattsuplocation, wattsuptime, wattsupvalue) VALUES (%s, %s, %s)"
while 1:
line = ser.readline()
DataArray = line.split(',') #CSV output
if len(DataArray) != 21:
continue
else:
Time = time.strftime("%Y-%m-%d %H:%M:%S")
Watts = float(DataArray[3])/10
cur.execute(Insert, (Location, Time, Watts))
conn.commit()
它通常工作,但我得到一些重复的数据,我不明白。当我查询数据库时,我可以找到类似的数据。
A, 2012-11-04 18:00:00, 5.0
A, 2012-11-04 18:00:01, 5.1
A, 2012-11-04 18:00:02, 5.0
A, 2012-11-04 18:00:03, 4.9
A, 2012-11-04 18:00:04, 5.0
A, 2012-11-04 18:00:05, 5.0
A, 2012-11-04 18:00:05, 5.0
A, 2012-11-04 18:00:05, 5.0
A, 2012-11-04 18:00:05, 5.0
A, 2012-11-04 18:00:06, 5.1
请注意,有重复的数据(A,2012-11-04 18:00:05,5.0)。我知道仪器只能在1秒内输出数据,所以我确定它不是仪器。我试着更改一些代码,以便每10个条目发生一次似乎改善情况的提交。
任何想法可能会发生什么?我很难过。
谢谢!
该pi没有“真正的”时钟,所以这是一种可能性。你超频了吗? (不知道它是否重要,但可能是计时问题的另一个来源)记录毫秒以查看记录是否仍然重复 – shaun5
表中表示该表具有禁止行重复的主键的部分在哪里? – hughdbrown
嗨shaun5和hubrbrown:有趣的想法,谢谢!所以我根据你的建议尝试了几件事。 1.完全摆脱了数据库部分,因为我不知道我在那里做了什么,并用打印语句取而代之。 2.我打印了datetime.datetime.now(),实际上,时间戳差别大约为0.05秒。 3.我在'ser'中添加了一个'timeout = None'选项,因为我真的很想把这个东西挂起来,直到我得到一整行。仍然没有决议。我确实注意到,当我得到复制品时,它会在暂停一段时间后连续打印它们。 –