Уведомления

Группа в Telegram: @pythonsu

#1 Май 17, 2010 22:57:47

alexx11
От:
Зарегистрирован: 2010-05-13
Сообщения: 208
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите как быть с уникальным ключём в SQLite

Т.к. тут больше с питоном, то пример на питоне:

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” идёт с разных потоков. Что посоветуете?



Офлайн

#2 Май 17, 2010 23:18:22

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Подскажите как быть с уникальным ключём в SQLite

Это что ещё за “ignore”?
Ты указал, что a уникально. Т.е. в таблице не может содержаться две записи с одинаковыми a. Соответственно, при попытке добавить запись с не уникальным a, вызывается исключение.
Или ты хочешь странного, или опиши лучше, чего ты хочешь добиться.

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



Отредактировано (Май 17, 2010 23:20:14)

Офлайн

#3 Май 17, 2010 23:31:25

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите как быть с уникальным ключём в SQLite

Не касаясь потоков.

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

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

Во втором:

try:
cur.execute("insert into t(a, b) values (?,?)", ('a', 2))
except sqlite3.IntegrityError:
pass



Отредактировано (Май 17, 2010 23:31:55)

Офлайн

#4 Май 17, 2010 23:42:58

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Подскажите как быть с уникальным ключём в SQLite

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



Офлайн

#5 Май 17, 2010 23:48:59

alexx11
От:
Зарегистрирован: 2010-05-13
Сообщения: 208
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите как быть с уникальным ключём в SQLite

ZZZ
Или ты хочешь странного, или опиши лучше, чего ты хочешь добиться.
Вроде вполне ясно описал что хочу вставлять в таблицу и не получать исключения
dimabest
В первом случае вместо INSERT пишем REPLACE.
не подходит, я не знаю ещё до вставки уникальна она или нет.
dimabest
либо проигнорировать вставку.
вот-вот, это уже ближе но как? “inser ignore into” такой команды в sqlite нет.



Офлайн

#6 Май 18, 2010 00:15:26

alexx11
От:
Зарегистрирован: 2010-05-13
Сообщения: 208
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите как быть с уникальным ключём в SQLite

dimabest
Во втором:
try:
cur.execute("insert into t(a, b) values (?,?)", ('a', 2))
except sqlite3.IntegrityError:
pass
Не заметил сразу, тоже не подходит, т.к на самом деле я юзаю executemany, т.е. команда insert идёт из всего списка, которые передаётся в executemany, и в случаее попадись один повторный элемент, возникнет исключение, а предсказать судьбу остальных не представляется возможным.



Офлайн

#7 Май 18, 2010 00:26:42

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Подскажите как быть с уникальным ключём в SQLite

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

Я уже сказал, что писать в sqlite в несколько потоков нельзя – оно не для того сделано. Организуй прослойку с очередью запросов, чтобы писать в один поток и проблема решиться.



Офлайн

#8 Май 18, 2010 00:49:39

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Подскажите как быть с уникальным ключём в SQLite

Офлайн

#9 Май 18, 2010 01:18:10

alexx11
От:
Зарегистрирован: 2010-05-13
Сообщения: 208
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите как быть с уникальным ключём в SQLite

ZZZ
alexx11 написал:

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

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

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



Офлайн

#10 Май 18, 2010 10:09:02

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите как быть с уникальным ключём в SQLite

ZZZ
dimabest написал:

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

*UPDATE
именно REPLACE

alexx11
dimabest написал:

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

не подходит, я не знаю ещё до вставки уникальна она или нет.
А знать не надо. Если строки с таким ключом нет - она будет вставлена, если есть - обновлена новыми данными



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version