O MySQL tem algo assim:
INSERT INTO visits (ip, hits)
VALUES ('127.0.0.1', 1)
ON DUPLICATE KEY UPDATE hits = hits + 1;
Pelo que eu sei, esse recurso não existe no SQLite, o que eu quero saber é se há alguma maneira de obter o mesmo efeito sem ter que executar duas consultas. Além disso, se isso não for possível, o que você prefere:
- SELECT + (INSERT ou UPDATE) ou
- UPDATE (+ INSERT se UPDATE falhar )
upsert
como este em uma transação, ou seja, com aexecutemany()
função Python ?Isso requer que a coluna "ip" tenha uma restrição UNIQUE (ou PRIMARY KEY).
EDIT: Outra ótima solução: https://stackoverflow.com/a/4330694/89771 .
fonte
REPLACE
não é uma opção.Eu prefiro
UPDATE (+ INSERT if UPDATE fails)
. Menos código = menos bugs.fonte
A resposta atual só funcionará em sqlite OR mysql (dependendo se você usa OR ou não). Então, se você quiser compatibilidade cross dbms, o seguinte servirá ...
fonte
REPLACE
funcionará no SQLite também, mas no MySQL sempre zera o contador para 0 - embora a consulta seja portátil, o resultado final será muito diferente.Você deve usar memcached para isso, pois é uma única chave (o endereço IP) que armazena um único valor (o número de visitas). Você pode usar a função de incremento atômico para garantir que não haja condições de "corrida".
É mais rápido que o MySQL e economiza carga para que o MySQL possa se concentrar em outras coisas.
fonte