存储在数据库中的重复数据

时间:2012-11-05 03:38:12

标签: python duplicates psycopg2 raspberry-pi

当我运行脚本时,我正在将重复的条目写入数据库,我想知道我可能做错了什么。

硬件
我有一台仪器通过115,200的串行通信连接到我的Raspberry Pi。仪器每秒输出一行数据,我想将这些数据存储到数据库中。每行以\ n。

结尾

软件
Python 2.7.3rc2
PySerial
PostgreSQL 9.1
Debian Wheezy

我创建了一个名为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个条目提交一次,这似乎可以改善这种情况。

知道可能会发生什么吗?我很难过。

谢谢!

1 个答案:

答案 0 :(得分:1)

一些想法 1)您可以向while循环添加一些wait语句。现在它正在运行循环并使用所有处理器时间 2)您正在使用串行到USB转换器,这些设备有时会缓冲数据。 3)板载UART还缓冲数据 4)在执行Readline时,它取决于用作终止字符的内容:Cr,LF或CrLF 5)您可以尝试使用Read然后读入您自己的字符串缓冲区并查找第一个终结符。