MySQL ma coś takiego:
INSERT INTO visits (ip, hits)
VALUES ('127.0.0.1', 1)
ON DUPLICATE KEY UPDATE hits = hits + 1;
O ile wiem, ta funkcja nie istnieje w SQLite, chciałbym wiedzieć, czy istnieje sposób na osiągnięcie tego samego efektu bez konieczności wykonywania dwóch zapytań. Jeśli nie jest to możliwe, co wolisz:
- SELECT + (INSERT lub UPDATE) lub
- UPDATE (+ INSERT, jeśli UPDATE nie powiedzie się )
upsert
takich w jednej transakcji, tj. Za pomocąexecutemany()
funkcji Pythona ?Wymaga to, aby kolumna „ip” miała ograniczenie UNIQUE (lub PRIMARY KEY).
EDYCJA: Kolejne świetne rozwiązanie: https://stackoverflow.com/a/4330694/89771 .
źródło
REPLACE
nie ma takiej opcji.Wolałbym
UPDATE (+ INSERT if UPDATE fails)
. Mniej kodu = mniej błędów.źródło
Bieżąca odpowiedź będzie działać tylko w sqlite LUB mysql (w zależności od tego, czy użyjesz OR, czy nie). Tak więc, jeśli chcesz kompatybilności z różnymi dbms, wykonaj następujące czynności ...
źródło
REPLACE
będzie działać również na SQLite, ale w MySQL zawsze zresetuje licznik do 0 - podczas gdy zapytanie będzie przenośne, wynik końcowy będzie się znacznie różnić.Powinieneś do tego użyć memcached, ponieważ jest to pojedynczy klucz (adres IP) przechowujący pojedynczą wartość (liczbę odwiedzin). Możesz użyć atomowej funkcji przyrostu, aby upewnić się, że nie ma warunków „wyścigu”.
Jest szybszy niż MySQL i oszczędza obciążenie, więc MySQL może skupić się na innych rzeczach.
źródło