python - 在 sqlite3 和 python 中插入表格。“with”关键字的魔力
问题描述
我正在关注这个sqlite3 的 python 教程。
我正在尝试使用此脚本在表中插入一行:
conn = sqlite3.connect(database)
sql = ''' INSERT INTO projects(name,begin_date,end_date)
VALUES(?,?,?) '''
project = ('X', '2015-01-01', '2015-01-30');
cur = conn.cursor()
cur.execute(sql,project)
conn.close()
我可以毫无错误地运行它,但没有插入行。
虽然,在使用时插入了行with
:
with conn:
sql = ''' INSERT INTO projects(name,begin_date,end_date)
VALUES(?,?,?) '''
project = ('X', '2015-01-01', '2015-01-30');
cur = conn.cursor()
cur.execute(sql,project)
有谁知道发生了什么?
更新
我在docs.python.org中发现
,在一个或多个execute
语句之后,一个语句commit
就像
cur.execute(sql, project)
conn.commit()
一切顺利。
但是,我仍然非常感谢with
关键字的一些技术解释
解决方案
但是,我仍然非常感谢 with 关键字的一些技术解释
commit()
将数据库连接用作上下文管理器(关键字)时不应使用的原因with
是,如果事务成功(意味着没有引发异常),则在这种情况下有一种自动提交的机制。
sqlite3 API 文档中对此进行了解释:
使用连接作为上下文管理器
连接对象可以用作自动提交或回滚事务的上下文管理器。如果发生异常,事务回滚;否则,事务被提交:
import sqlite3 con = sqlite3.connect(":memory:") con.execute("create table person (id integer primary key, firstname varchar unique)") # Successful, con.commit() is called automatically afterwards with con: con.execute("insert into person(firstname) values (?)", ("Joe",)) # con.rollback() is called after the with block finishes with an exception, the # exception is still raised and must be caught try: with con: con.execute("insert into person(firstname) values (?)", ("Joe",)) except sqlite3.IntegrityError: print("couldn't add Joe twice")