Python и SQLite: что произойдет, если я вставлю две строки с одинаковым первичным ключом?

-2

Вот мой стол:

drop table if exists stocks;
create table stocks (
  stock_id integer primary key not null,
  stockname string not null
);

Код Python:

import sqlites3    
rows = [(1, 'IBM'),
          (2, 'MSOFT'),
          (1, 'GOOG'),
         ]
#c.executemany('insert into stocks values (?,?)', rows )
connection.commit()

В rows 1 и 3 имеют один и тот же первичный ключ.

Что произойдет, если я это сделаю? Будет ли исключение? Что я могу сделать, чтобы поймать исключение?

На самом деле rows представляют собой динамический ввод, поэтому я не могу сортировать или редактировать rows сначала. И я работаю с Flask 0.9 и Python 2.6 на Ubuntu 10.04.

  • 1
    Почему бы вам не попробовать и посмотреть, что происходит?
  • 0
    $ python >>> import sqlite3 >>> (insert commands here)
Показать ещё 3 комментария
Теги:
sqlite3

1 ответ

3
Лучший ответ

Будет исключение; sqlite3.IntegrityError будет поднят:

>>> c.executemany('insert into stocks values (?,?)', [(1, 'IBM'), (2, 'MSOFT'), (1, 'GOOG')])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
sqlite3.IntegrityError: PRIMARY KEY must be unique

Любые вставки перед возникновением исключения будут успешными, поэтому вы хотите вызвать connection.rollback() когда возникает исключение. Еще лучше использовать соединение в качестве менеджера контекста для автоматического отката или фиксации:

try:
    with connection:
        c = connection.cursor()
        c.executemany('insert into stocks values (?,?)', rows)
    # insertion succeeded, 'connection.commit()' is called automatically
except sqlite3.IntegrityError:
    # insertion failed, 'connection.rollback()' is called automatically

Ещё вопросы

Сообщество Overcoder
Наверх
Меню