在python中使用sqlite3时使用;加上;关键词

在python中使用sqlite3时使用;加上;关键词,python,python-2.7,sqlite,Python,Python 2.7,Sqlite,我在做一个教程,发现了一种处理sqlite3连接的方法, 然后我研究了WITH关键字,发现它是一种尝试的替代方法,除了最后一种方法 据说,在文件处理的情况下,“WITH”会自动处理文件的关闭,我认为与zetcode教程中所述的连接类似:- 使用With关键字,Python解释器会自动释放 资源。它还提供错误处理。” 所以我认为使用这种方式处理事情会很好,但我不明白为什么(内部作用域和外部作用域)语句都能工作?不应该释放连接吗 import sqlite3 con = sqlite3.conne

我在做一个教程,发现了一种处理sqlite3连接的方法, 然后我研究了WITH关键字,发现它是一种尝试的替代方法,除了最后一种方法

据说,在文件处理的情况下,“WITH”会自动处理文件的关闭,我认为与zetcode教程中所述的连接类似:-

使用With关键字,Python解释器会自动释放 资源。它还提供错误处理。”

所以我认为使用这种方式处理事情会很好,但我不明白为什么(内部作用域和外部作用域)语句都能工作?不应该释放连接吗

import sqlite3

con = sqlite3.connect('test.db')

with con:    
    cur = con.cursor()    

    cur.execute('SELECT 1,SQLITE_VERSION()')
    data = cur.fetchone()   
    print data        

cur.execute('SELECT 2,SQLITE_VERSION()')
data = cur.fetchone()
print data
哪个输出

(1, u'3.6.21')
(2, u'3.6.21')
我不知道WITH在这里到底做了什么(或者通常做了什么),因此,请您详细说明WITH over TRY CATCH在本文中的用法

每次查询时是否应该打开和关闭连接?(我在一个函数中构造查询,每次我都用一个参数调用该函数)这是一个好的做法吗?

来自文档:

连接对象可用作自动提交或回滚事务的上下文管理器。如果发生异常,事务将回滚;否则,事务将被提交:


因此,上下文管理器不会释放连接,而是确保在发生异常时回滚连接上发生的任何事务,或者以其他方式提交。。。例如,对于
删除
更新
插入
查询非常有用。

通常,上下文管理器可以自由地执行其作者希望它在使用时执行的任何操作。设置/重置某个系统状态、使用后清理资源、获取/释放锁等

特别是,作为上下文管理器,数据库连接对象会创建一个事务。如果要自动关闭连接,可以执行以下操作

with contextlib.closing(sqlite3.connect('test.db')) as con:
    with con as cur:
        cur.execute('SELECT 1,SQLITE_VERSION()')
        data = cur.fetchone()   
        print data        

    with con as cur:
        cur.execute('SELECT 2,SQLITE_VERSION()')
        data = cur.fetchone()
        print data

您还可以围绕sqlite3编写自己的包装器,以支持

class SQLite():
    def __init__(self, file='sqlite.db'):
        self.file=file
    def __enter__(self):
        self.conn = sqlite3.connect(self.file)
        self.conn.row_factory = sqlite3.Row
        return self.conn.cursor()
    def __exit__(self, type, value, traceback):
        self.conn.commit()
        self.conn.close()

with SQLite('test.db') as cur:
    print(cur.execute('select sqlite_version();').fetchall()[0][0])

阅读:-这应该可以解释你的问题,因此没有发布资源或错误处理广告?你正在阅读的教程有点误导。使用默认上下文管理器时,没有显式关闭连接。您可能想看看
contextlib.closing
…在python 3中,这似乎给出了
AttributeError:'sqlite3.Connection'对象没有属性'fetchone'
。似乎解决了问题problem@Løiten或多或少,是的。然而,另一个答案并不检索数据。因此,它并不能真正解决
.fetchone()
的问题。目前我手头没有解决方案,因为我对Py3和SQlite没有太多经验。是否有必要执行self.conn.commit()?With不会自动提交?@cikatomo
With
只执行我们让它执行的操作。
SQLite
类告诉
with
该做什么。如果您想通过
提交
,则必须在
\uuu退出