Найти - Пользователи
Полная версия: Подскажите как быть с уникальным ключём в SQLite
Начало » Базы данных » Подскажите как быть с уникальным ключём в SQLite
1 2
alexx11
Т.к. тут больше с питоном, то пример на питоне:
con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("create table t(a text unique, b integer)")

cur.execute("insert into t(a, b) values (?,?)", ('a', 1))
# вторая строка
cur.execute("insert into t(a, b) values (?,?)", ('a', 2))
cur.execute("select * from t")
print cur.fetchall()
Как сделать что б “вторая строка” не генерировала ошибку, т.е. что-то типа типа “insert ignore into t(a, b)values ('c',1)”, но к сожалению sqlite такую команду не поддерживает. А текстовое поле должно быть уникально так “insert” идёт с разных потоков. Что посоветуете?
ZZZ
Это что ещё за “ignore”?
Ты указал, что a уникально. Т.е. в таблице не может содержаться две записи с одинаковыми a. Соответственно, при попытке добавить запись с не уникальным a, вызывается исключение.
Или ты хочешь странного, или опиши лучше, чего ты хочешь добиться.

P.S. Да, sqlite3 не любит много потоков. Лучше сделай очередь.
dimabest
Не касаясь потоков.

У тебя а - уникальный ключ. При записи с имеющимся ключом - возможны 2 варианта: обновить запись с таким ключом либо проигнорировать вставку.

В первом случае вместо INSERT пишем REPLACE.

Во втором:
try:
cur.execute("insert into t(a, b) values (?,?)", ('a', 2))
except sqlite3.IntegrityError:
pass
ZZZ
dimabest
В первом случае вместо INSERT пишем REPLACE.
*UPDATE
alexx11
ZZZ
Или ты хочешь странного, или опиши лучше, чего ты хочешь добиться.
Вроде вполне ясно описал что хочу вставлять в таблицу и не получать исключения
dimabest
В первом случае вместо INSERT пишем REPLACE.
не подходит, я не знаю ещё до вставки уникальна она или нет.
dimabest
либо проигнорировать вставку.
вот-вот, это уже ближе но как? “inser ignore into” такой команды в sqlite нет.
alexx11
dimabest
Во втором:
try:
cur.execute("insert into t(a, b) values (?,?)", ('a', 2))
except sqlite3.IntegrityError:
pass
Не заметил сразу, тоже не подходит, т.к на самом деле я юзаю executemany, т.е. команда insert идёт из всего списка, которые передаётся в executemany, и в случаее попадись один повторный элемент, возникнет исключение, а предсказать судьбу остальных не представляется возможным.
ZZZ
alexx11
Вроде вполне ясно описал что хочу вставлять в таблицу и не получать исключения
Не получить исключения и добавить в таблицу? Или не добавить? Или записать последнее?
Формулируй свои мысли точнее.

Я уже сказал, что писать в sqlite в несколько потоков нельзя – оно не для того сделано. Организуй прослойку с очередью запросов, чтобы писать в один поток и проблема решиться.
Lexander
Пробовал http://www.sqlite.org/lang_conflict.html ?
alexx11
ZZZ
alexx11 написал:

Вроде вполне ясно описал что хочу вставлять в таблицу и не получать исключения

Не получить исключения и добавить в таблицу? Или не добавить? Или записать последнее?
Формулируй свои мысли точнее.

Я уже сказал, что писать в sqlite в несколько потоков нельзя – оно не для того сделано. Организуй прослойку с очередью запросов, чтобы писать в один поток и проблема решиться.
Тут за посты не платят.
Lexander
Пробовал http://www.sqlite.org/lang_conflict.html ?
Спасибо огромное, и прям спасибо отдельно что люди умные ещё заходят на форумы.
dimabest
ZZZ
dimabest написал:

В первом случае вместо INSERT пишем REPLACE.

*UPDATE
именно REPLACE

alexx11
dimabest написал:

В первом случае вместо INSERT пишем REPLACE.

не подходит, я не знаю ещё до вставки уникальна она или нет.
А знать не надо. Если строки с таким ключом нет - она будет вставлена, если есть - обновлена новыми данными
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB