當我運行我的腳本時,我正在將重複條目清理到數據庫中,並且我在想我可能會做錯什麼。將重複的數據存儲到數據庫中
硬件
我有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'選項,因爲我真的很想把這個東西掛起來,直到我得到一整行。仍然沒有決議。我確實注意到,當我得到複製品時,它會在暫停一段時間後連續打印它們。 –