在sqlite3和python中插入表中。 “ with”关键字的魔力

时间:2019-03-07 08:41:43

标签: python sqlite

我正在关注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() 关键字的一些技术说明

1 个答案:

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