Python和SQLite:如果我插入具有相同主键的两行,会发生什么?

时间:2012-12-24 09:08:38

标签: python sql sqlite

这是我的表:

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。

1 个答案:

答案 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