首页 > 解决方案 > 在 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关键字的一些技术解释

标签: pythonsqlite

解决方案


但是,我仍然非常感谢 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")

推荐阅读