MySQL tiene algo como esto:
INSERT INTO visits (ip, hits)
VALUES ('127.0.0.1', 1)
ON DUPLICATE KEY UPDATE hits = hits + 1;
Por lo que sé, esta característica no existe en SQLite, lo que quiero saber es si hay alguna forma de lograr el mismo efecto sin tener que ejecutar dos consultas. Además, si esto no es posible, qué prefieres:
- SELECCIONAR + (INSERTAR o ACTUALIZAR) o
- ACTUALIZAR (+ INSERTAR si ACTUALIZAR falla )
upsert
como esta en una transacción, es decir, con laexecutemany()
función Python .Esto requiere que la columna "ip" tenga una restricción ÚNICA (o CLAVE PRIMARIA).
EDITAR: Otra gran solución: https://stackoverflow.com/a/4330694/89771 .
fuente
REPLACE
no es una opción.Yo prefiero
UPDATE (+ INSERT if UPDATE fails)
. Menos código = menos errores.fuente
La respuesta actual solo funcionará en sqlite OR mysql (dependiendo de si usa OR o no). Entonces, si desea compatibilidad cruzada con dbms, lo siguiente será suficiente ...
fuente
REPLACE
también funcionará en SQLite, pero en MySQL siempre restablecerá el contador a 0; mientras que la consulta será portátil, el resultado final será muy diferente.Debe usar Memcached para esto, ya que es una clave única (la dirección IP) que almacena un valor único (el número de visitas). Puede utilizar la función de incremento atómico para asegurarse de que no haya condiciones de "carrera".
Es más rápido que MySQL y ahorra carga para que MySQL pueda concentrarse en otras cosas.
fuente