我正在关注this sqlite3 for 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
语句之后,一个像{p>
commit
一切都很好。
但是,尽管如此,我还是非常感谢cur.execute(sql, project)
conn.commit()
关键字的一些技术说明
答案 0 :(得分:1)
但是,我仍然非常希望对 关键字
在将数据库连接用作上下文管理器(commit()
关键字)时,您不应该with
的原因是因为在这种情况下有一种自动提交的机制情况下,如果交易成功(这意味着不会引发异常)。
它在sqlite3 API doc中有解释:
将连接用作上下文管理器
连接对象可用作自动自动运行的上下文管理器 提交或回滚事务。如果发生例外情况, 交易被回滚;否则,交易将被提交:
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")