Вот мой стол:
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.
Будет исключение; 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
$ python
>>> import sqlite3
>>> (insert commands here)