2012-11-05 8 views
1

스크립트를 실행할 때 데이터베이스에 중복 항목이 포함되어 있으며 무엇이 잘못 되었을지 궁금합니다.데이터베이스에 중복 데이터가 저장되는 경우

하드웨어
나는 115,200에서 시리얼 통신을 통해 내 라즈베리 파이에 연결된 기기를 가지고있다. 장비는 1 초마다 데이터 라인을 출력하고이 데이터를 데이터베이스에 저장하려고합니다. 각 줄은 \ n로 끝납니다.

소프트웨어
파이썬 2.7.3rc2
PySerial이
PostgreSQL의 9.1
데비안 위지이

데이터베이스가 내가 만든 wattsup 하나 개의 테이블을 요구했다 :

CREATE TABLE wattsup (
    wattsuplocation text 
    wattsuptime timestamp 
    wattsupvalue numeric 
); 

내 파이썬 스크립트가 보인다 좋아요 :

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 개 항목마다 커밋이 발생하도록 코드를 변경하려고 시도했다.

어떤 일이 벌어 질지 궁금하십니까? 나는 혼란 스럽다.

감사합니다.

+0

pi에는 '실제'시계가 없으므로 하나의 가능성이 있습니다. 오버 클러킹 하시겠습니까? (중요한지는 모르지만 타이밍 문제의 또 다른 원인 일 수 있음) 밀리 초를 기록하여 레코드가 여전히 중복되는지 확인 – shaun5

+0

테이블에 행이 중복되지 않도록하는 기본 키가 있다고하는 부분은 어디에 있습니까? – hughdbrown

+0

안녕하세요, shaun5 및 hughbrown : 재미있는 생각, 감사합니다! 그래서 나는 당신의 제안에 따라 몇 가지 것을 시도했다. 1. 어쨌든 내가 무엇을하고 있는지 알지 못하기 때문에 데이터베이스 부분을 완전히 없애고 print 문으로 대체했습니다. 2. datetime.datetime.now()를 인쇄했는데 실제로 시간 소인은 약 0.05 초 정도 다릅니다. 3.'serout'에'timeout = None' 옵션을 추가했습니다. 왜냐하면 제가 실물을 얻을 때까지이 일을 정말로 원하지 않기 때문입니다. 아직 해결책 없음. 나는 사본을 얻었을 때 한동안 잠시 멈춘 후에 그것을 순식간에 빠르게 인쇄한다는 것을 알아 챘다. –

답변

1

몇 가지 아이디어 1) while 루프에 wait 문을 추가 할 수 있습니다. 이제는 루프를 실행하고 모든 프로세서 시간을 사용합니다. 2) 직렬 USB 변환기를 사용 중이며이 장치는 때때로 데이터를 버퍼링합니다. 3) 온보드 UART도 데이터를 버퍼링합니다. 4) Readline을 수행 할 때 Cr, LF 또는 CrLF로 끝나는 문자에 따라 달라집니다. 5) 읽기를 시도한 다음 자신의 문자열을 읽을 수 있습니다 버퍼 및 첫 번째 종결자를 찾습니다.

관련 문제