这是我的表:
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
中,第一个和第三个拥有相同的主键。
如果我这样做会怎么样?会有例外吗?我能做些什么来捕捉异常?
实际上,rows
是动态输入,因此我无法首先对rows
进行排序或编辑。我在Ubuntu 10.04上使用Flask 0.9和Python 2.6。
答案 0 :(得分: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()
。更好的是,使用连接作为context manager自动回滚或提交:
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