PYTHON SQLITE3 INSERTION: если есть, то сделать дополнение - PullRequest
0 голосов
/ 27 августа 2018

Предварительное освещение:

У меня есть таблица "baseline" в Sqlite3-DB. Таблица «Базовая линия» имеет следующие столбцы:

  1. слово
  2. Счетчик

Вопрос: Любые идеи о том, как можно запустить движок sqlite3 (если он более эффективен), сделают для меня следующую операцию:

  • если в таблице "baseline" уже есть элемент с первичным ключом "word", то при вставке не заменяйте эту строку, а делайте сложение между старым счетчиком и новым счетчиком.

* * Пример тысячи двадцать-одина * +1022 *

После следующих команд вставок:

"INSERT INTO  baseline(word, counter) VALUES 'bla', 1; "
"INSERT INTO  baseline(word, counter) VALUES 'bla', 1; "

Я хочу получить следующие данные из БД:

>>> "SELECT * FROM baseline;" 
'("bla", 2)'

Спасибо заранее =)

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Если слово является первичным ключом, т.е.

CREATE TABLE baseline (word TEXT PRIMARY KEY, counter INTEGER);

Тогда будет работать следующее:

INSERT OR REPLACE INTO baseline VALUES (
    'foo',
    COALESCE((SELECT counter FROM baseline WHERE word='foo'), 0) + 1
);

Функция COALESCE() возвращает либо счетчик, если слово существует в таблице, либо 0, если нет.

0 голосов
/ 27 августа 2018

Если у вас есть уникальное ограничение на столбец word, вы можете сделать это довольно легко с помощью двух операторов.

INSERT OR IGNORE INTO baseline
(word, counter)
VALUES
('bla', 0);

Здесь мы либо вставляем новое слово со счетчиком 0, либо, если оно уже существует, ничего не происходит.

UPDATE baseline
SET counter = counter+1
WHERE word = 'bla';

Запустите этот оператор обновления независимо от того, существовал ли ключ word. Вот почему мы устанавливаем counter на 0 вместо 1. Таким образом, нам не нужна внешняя логика в коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...