2017-11-14 2 views
0

ich eine MySQL-Datenbank, die eine Tabelle commands mit der folgenden Struktur namens enthält:Python MySQLdb: Einfügen von doppeltem Eintrag in eine Tabelle mit UNIQUE Feldern

+-----------+---------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-----------+---------------+------+-----+---------+----------------+ 
| id  | int(11)  | NO | PRI | NULL | auto_increment | 
| input  | varchar(3000) | NO |  | NULL |    | 
| inputhash | varchar(66) | YES | UNI | NULL |    | 
+-----------+---------------+------+-----+---------+----------------+ 

ich Zeilen einzufügen versuchen darin, aber nur dann, wenn Das Feld inputhash ist nicht bereits vorhanden. Ich dachte INSERT IGNORE war der Weg, dies zu tun, aber ich bekomme immer noch Warnungen.

Zum Beispiel: Angenommen, dass die Lage bereits enthält

+----+---------+------------------------------------------------------------------+ 
| id | input | inputhash              | 
+----+---------+------------------------------------------------------------------+ 
| 1 | enable | 234a86bf393cadeba1bcbc09a244a398ac10c23a51e7fd72d7c449ef0edaa9e9 | 
+----+---------+------------------------------------------------------------------+ 

Dann, wenn der folgenden Python Code zum Einfügen einer Zeile

import MySQLdb 

db = MySQLdb.connect(host='xxx.xxx.xxx.xxx', user='xxxx', passwd='xxxx', db='dbase') 
c = db.cursor() 
c.execute('INSERT IGNORE INTO `commands` (`input`, `inputhash`) VALUES (%s, %s)', ('enable', '234a86bf393cadeba1bcbc09a244a398ac10c23a51e7fd72d7c449ef0edaa9e9',)) 

Ich erhalte die Warnung

Warning: Duplicate entry '234a86bf393cadeba1bcbc09a244a398ac10c23a51e7fd72d7c449ef0edaa9e9' for key 'inputhash' 
    c.execute('INSERT IGNORE INTO `commands` (`input`, `inputhash`) VALUES (%s, %s)', ('enable','234a86bf393cadeba1bcbc09a244a398ac10c23a51e7fd72d7c449ef0edaa9e9',)) 

Warum passiert das? Ich dachte, dass der ganze Punkt der Verwendung INSERT IGNORE auf einer Tabelle mit UNIQUE Felder ist, um den Fehler zu unterdrücken und einfach den Schreibversuch zu ignorieren?

Was ist der richtige Weg, um dies zu beheben? Ich nehme an, ich kann die Warnung in Python mit warnings.filterwarnings('ignore') unterdrücken, aber warum erscheint die Warnung an erster Stelle?

+0

Wenn Sie den IGNORE-Modifikator verwenden, werden Fehler beim Ausführen der INSERT-Anweisung ignoriert. Ohne IGNORE beispielsweise führt eine Zeile, die einen vorhandenen UNIQUE-Index oder PRIMARY KEY-Wert in der Tabelle dupliziert, zu einem Fehler mit doppelten Schlüsseln, und die Anweisung wird abgebrochen. Mit IGNORE wird die Zeile verworfen und es tritt kein Fehler auf. Ignorierte Fehler generieren stattdessen Warnungen. (https://dev.mysql.com/doc/refman/5.7/en/insert.html) Achten Sie besonders auf "Ignorierte Fehler generieren stattdessen Warnungen". –

+0

Also, der einzige "saubere" Weg (keine Fehler, keine Warnungen) zu vermeiden, doppelte Daten in der Datenbank zu speichern ist, indem Sie die Warnungen ausschalten ?! Ich kann nicht überprüfen, ob der Wert aufgrund von Race Conditions bereits existiert (jemand könnte den gleichen Wert wie ich schreiben, nachdem ich festgestellt habe, dass es nicht existiert, aber bevor ich meins geschrieben habe). Ich habe versucht, den Tisch zu sperren, aber das hat auch nicht funktioniert. – bontchev

Antwort

0

Ich hoffe, es wird dir helfen!

import MySQLdb 

db = MySQLdb.connect(host='xxx.xxx.xxx.xxx', user='xxxx', passwd='xxxx', 
db='dbase') 
c = db.cursor() 
c.execute('INSERT INTO `commands` (`input`, `inputhash`) VALUES ('enable', 
'234a86bf393cadeba1bcbc09a244a398ac10c23a51e7fd72d7c449ef0edaa9e9') ON 
DUPLICATE KEY UPDATE 'inputhash'='inputhash') 
+0

Was genau versuchst du hier zu machen? Normalerweise wird 'ON DUPLICATE KEY UPDATE' verwendet, um eine Schreiboperation zu erzwingen, wenn sie normalerweise wegen eines' UNIQUE'-Feldes nicht auftreten würde. Außerdem habe ich in meinem Fall ein automatisch inkrementiertes Feld, würde das nicht einfach zu doppelten Zeilen führen? Ich möchte keine doppelten Zeilen; Ich _wollte_ die duplizierten Informationen ignoriert werden. Ich will einfach keine Warnungen bekommen, wenn es ist. – bontchev