스크립트를 실행할 때 데이터베이스에 중복 항목이 포함되어 있으며 무엇이 잘못 되었을지 궁금합니다.데이터베이스에 중복 데이터가 저장되는 경우
하드웨어
나는 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 개 항목마다 커밋이 발생하도록 코드를 변경하려고 시도했다.
어떤 일이 벌어 질지 궁금하십니까? 나는 혼란 스럽다.
감사합니다.
pi에는 '실제'시계가 없으므로 하나의 가능성이 있습니다. 오버 클러킹 하시겠습니까? (중요한지는 모르지만 타이밍 문제의 또 다른 원인 일 수 있음) 밀리 초를 기록하여 레코드가 여전히 중복되는지 확인 – shaun5
테이블에 행이 중복되지 않도록하는 기본 키가 있다고하는 부분은 어디에 있습니까? – hughdbrown
안녕하세요, shaun5 및 hughbrown : 재미있는 생각, 감사합니다! 그래서 나는 당신의 제안에 따라 몇 가지 것을 시도했다. 1. 어쨌든 내가 무엇을하고 있는지 알지 못하기 때문에 데이터베이스 부분을 완전히 없애고 print 문으로 대체했습니다. 2. datetime.datetime.now()를 인쇄했는데 실제로 시간 소인은 약 0.05 초 정도 다릅니다. 3.'serout'에'timeout = None' 옵션을 추가했습니다. 왜냐하면 제가 실물을 얻을 때까지이 일을 정말로 원하지 않기 때문입니다. 아직 해결책 없음. 나는 사본을 얻었을 때 한동안 잠시 멈춘 후에 그것을 순식간에 빠르게 인쇄한다는 것을 알아 챘다. –