2017-01-28 4 views
1

Я вставляю данные в sqlite3 с помощью скрипта python. Но моя проблема заключается в том, что скрипт вставляет три дубликаты (одни и те же) данные. Просто вставлять одинаковые данные три раза.Как предотвратить множественные записи (Дублировать) в SQLite3 с помощью Python

print flag   
    if flag == 1: 
     print colored('Authorized', 'green') 
     pi1.write(6, 0) 
     conn1 = sqlite3.connect('db/local.db') 
     c = conn1.cursor() 
     i = datetime.datetime.now() 
     date = i.strftime("%Y-%m-%d %H:%M:%S") 
     c.execute("INSERT INTO lock_logs (msg,created_at,card,date,host_ip,door_name,state) VALUES ('Authorized card','"+date+"', "+reader_value+", '"+date+"', '"+get_ip_address('eth0')+"', 'NL_1','opened')") 
     conn1.commit() 
     conn1.close() 
     time.sleep(3) 
     pi1.write(6, 1) 
     print "inserted" 
     #cron will send log to server 
    else: 
     print colored('Not Authorized', 'red') 
     pi1.write(6, 1) 
     #store log to local sqllight file 
     #conn = sqlite3.connect('db/local.db') 
     conn2 = sqlite3.connect('db/local.db') 
     c = conn2.cursor() 
     i = datetime.datetime.now() 
     date = i.strftime("%Y-%m-%d %H:%M:%S") 
     c.execute("INSERT INTO lock_logs (msg,created_at,card,date,host_ip,door_name,state) VALUES ('Not Authorized card','"+date+"', "+reader_value+", '"+date+"', '"+get_ip_address('eth0')+"', 'NL_1','failed')") 
     conn2.commit() 
     conn2.close() 
     #cron will send log to server 
    print "_____________________________________" 

Примечание: Если раздел и еще раздел выполнить только один раз, а три записи вставляется вместо вставки только один.

Примеры данных в файл базы данных (local.db)

545|2017-01-28 20:35:44||Authorized card|43448981|2017-01-28 20:35:44|172.20.100.15|NL_1|opened|0 
546|2017-01-28 20:35:44||Authorized card|43448981|2017-01-28 20:35:44|172.20.100.15|NL_1|opened|0 
547|2017-01-28 20:35:44||Authorized card|43448981|2017-01-28 20:35:44|172.20.100.15|NL_1|opened|0 

Как предотвратить это автоматический многократный въезд?

+0

Это должно помочь вам: http://stackoverflow.com/questions/19337029/insert-if-not-exists-statement-in-sqlite – McBarby

+0

Нет, это помогло мне в решении проблемы – webDev

ответ

1

Основываясь на данных образца, метка времени и идентификатор карты дублируются для нескольких записей. Вы можете создать индекс для уникальности этих двух полей, что предотвратит вставку нескольких записей из базы данных.

CREATE UNIQUE INDEX index_card_and_created_at_on_lock_logs ON lock_logs(card, created_at); 

Этот индекс уникальности будет отклонять записи, в которых эти два поля дублируются.

+0

, но мой вопрос в том, почему я получаю три записи. Я использовал только одну запись перед тем, как использовать этот же скрипт. Я могу это сделать и спасибо, что тоже сработает. Но почему три записи? даже раздел if else выполняется только один раз. – webDev

+0

Поскольку я могу видеть только часть вашего кода, я не уверен. Я могу предположить, что устройство для чтения карт-карт делает несколько операций чтения в секунду. – Richard

+0

Нет блока кода внутри оператора if выполняется только один раз. – webDev

Смежные вопросы