В MySQL есть что-то вроде этого:
INSERT INTO visits (ip, hits)
VALUES ('127.0.0.1', 1)
ON DUPLICATE KEY UPDATE hits = hits + 1;
Насколько я знаю, этой функции в SQLite нет, я хочу знать, есть ли способ добиться того же эффекта без выполнения двух запросов. Также, если это невозможно, что вы предпочтете:
- ВЫБРАТЬ + (ВСТАВИТЬ или ОБНОВИТЬ) или
- ОБНОВЛЕНИЕ (+ ВСТАВИТЬ, если ОБНОВЛЕНИЕ не удалось )
upsert
подобных операций в одной транзакции, то есть с помощьюexecutemany()
функции Python ?Это требует, чтобы столбец «ip» имел ограничение UNIQUE (или PRIMARY KEY).
РЕДАКТИРОВАТЬ: еще одно отличное решение: https://stackoverflow.com/a/4330694/89771 .
источник
REPLACE
это не вариант.Я бы предпочел
UPDATE (+ INSERT if UPDATE fails)
. Меньше кода = меньше ошибок.источник
Текущий ответ будет работать только в sqlite OR mysql (в зависимости от того, используете ли вы OR или нет). Итак, если вам нужна кросс-совместимость с dbms, подойдет следующее ...
источник
REPLACE
будет работать и на SQLite, но в MySQL он всегда будет сбрасывать счетчик на 0 - хотя запрос будет переносимым, конечный результат будет сильно отличаться.Для этого следует использовать memcached, поскольку это единственный ключ (IP-адрес), хранящий одно значение (количество посещений). Вы можете использовать функцию атомарного приращения, чтобы убедиться, что нет условий "гонки".
Он быстрее MySQL и экономит нагрузку, поэтому MySQL может сосредоточиться на других вещах.
источник