MySQL a quelque chose comme ceci:
INSERT INTO visits (ip, hits)
VALUES ('127.0.0.1', 1)
ON DUPLICATE KEY UPDATE hits = hits + 1;
Autant que je sache, cette fonctionnalité n'existe pas dans SQLite, ce que je veux savoir, c'est s'il existe un moyen d'obtenir le même effet sans avoir à exécuter deux requêtes. Aussi, si ce n'est pas possible, que préférez-vous:
- SELECT + (INSERT ou UPDATE) ou
- UPDATE (+ INSERT si UPDATE échoue )
upsert
comme ça en une seule transaction, c'est-à-dire avec laexecutemany()
fonction Python ?Cela nécessite que la colonne "ip" ait une contrainte UNIQUE (ou PRIMARY KEY).
EDIT: Une autre excellente solution: https://stackoverflow.com/a/4330694/89771 .
la source
REPLACE
n'est pas une option.Je préférerais
UPDATE (+ INSERT if UPDATE fails)
. Moins de code = moins de bogues.la source
La réponse actuelle ne fonctionnera que dans sqlite OU mysql (selon que vous utilisez OU ou non). Donc, si vous voulez une compatibilité cross dbms, ce qui suit fera l'affaire ...
la source
REPLACE
fonctionnera également sur SQLite, mais sur MySQL, il réinitialisera toujours le compteur à 0 - alors que la requête sera portable, le résultat final sera très différent.Vous devez utiliser memcached pour cela car il s'agit d'une seule clé (l'adresse IP) stockant une seule valeur (le nombre de visites). Vous pouvez utiliser la fonction d'incrémentation atomique pour vous assurer qu'il n'y a pas de conditions de «course».
C'est plus rapide que MySQL et économise la charge afin que MySQL puisse se concentrer sur d'autres choses.
la source