SQLite INSERTION SUR le DOUBLE de la CLÉ de mise à JOUR (UPSERT)
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 si 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
- Mise à JOUR (+ INSERT si la mise à JOUR échoue)
Vous devez vous connecter pour publier un commentaire.
Depuis 3.24.0 SQLite prend également en charge upsert, alors maintenant vous pouvez simplement écrire la suite de
upsert
comme cela en une seule opération, c'est à dire avec le Pythonexecutemany()
fonction?Cela exige de la "propriété intellectuelle" de la colonne d'avoir un UNIQUE (ou de la CLÉ PRIMAIRE) contrainte.
EDIT: une Autre excellente solution: https://stackoverflow.com/a/4330694/89771.
REPLACE
n'est pas une option.Je préfère
UPDATE (+ INSERT if UPDATE fails)
. Moins de code = moins de bugs.La réponse actuelle ne fonctionnera que dans sqlite OU mysql (selon si vous utilisez OU ou pas). Donc, si vous voulez de la croix-sgbd de compatibilité, ce qui suit va faire...
REPLACE
va travailler sur SQLite trop, mais sur MySQL, il sera toujours remettre le compteur à 0 - tandis que la requête sera portable, le résultat final sera différent beaucoup.Vous devez utiliser memcached pour cela, car c'est une clé unique (l'adresse IP) de stocker une valeur unique (le nombre de visites). Vous pouvez utiliser la atomique en fonction increment pour s'assurer il n'y a pas de "race" des conditions.
Il est plus rapide que MySQL et enregistre la charge MySQL peut se concentrer sur d'autres choses.