MySQL hat ungefähr so etwas:
INSERT INTO visits (ip, hits)
VALUES ('127.0.0.1', 1)
ON DUPLICATE KEY UPDATE hits = hits + 1;
Soweit ich weiß, ist diese Funktion in SQLite nicht vorhanden. Ich möchte wissen, ob es eine Möglichkeit gibt, denselben Effekt zu erzielen, ohne zwei Abfragen ausführen zu müssen. Wenn dies nicht möglich ist, was bevorzugen Sie:
- SELECT + (INSERT oder UPDATE) oder
- UPDATE (+ INSERT, wenn UPDATE fehlschlägt )
upsert
solcher Aktionen in einer Transaktion ausführen können, dh mit der Python-executemany()
Funktion.Dies erfordert, dass die Spalte "ip" eine EINZIGARTIGE (oder PRIMARY KEY) Einschränkung aufweist.
BEARBEITEN: Eine weitere großartige Lösung: https://stackoverflow.com/a/4330694/89771 .
quelle
REPLACE
ist keine Option.Ich würde es vorziehen
UPDATE (+ INSERT if UPDATE fails)
. Weniger Code = weniger Fehler.quelle
Die aktuelle Antwort funktioniert nur in SQLite ODER MySQL (je nachdem, ob Sie OR verwenden oder nicht). Wenn Sie also Cross-DBMS-Kompatibilität wünschen, reicht Folgendes aus ...
quelle
REPLACE
funktioniert auch unter SQLite, aber unter MySQL wird der Zähler immer auf 0 zurückgesetzt - während die Abfrage portierbar ist, unterscheidet sich das Endergebnis stark.Sie sollten hierfür memcached verwenden, da es sich um einen einzelnen Schlüssel (die IP-Adresse) handelt, in dem ein einzelner Wert (die Anzahl der Besuche) gespeichert ist. Sie können die atomare Inkrementfunktion verwenden, um sicherzustellen, dass keine "Race" -Bedingungen vorliegen.
Es ist schneller als MySQL und spart die Last, sodass sich MySQL auf andere Dinge konzentrieren kann.
quelle