请详细说明在这种情况下使用“WITH”而不是“TRY CATCH”

2023-12-19

为了处理与 SQLite3 的连接,我研究了WITH关键字并发现它是一个替代品try,except,finally。据说在文件处理的情况下,“WITH”会自动处理关闭文件,我认为与中所述的连接类似泽特代码教程 http://zetcode.com/db/sqlitepythontutorial/:

》通过with关键字,Python解释器自动释放 资源。它还提供错误处理。”

我无法弄清楚为什么这两个(内部作用域和外部作用域)语句都有效。不应该WITH释放连接?

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在此背景下。是否应该在每个查询上打开和关闭连接(我在每次使用参数调用的函数内制定查询)?


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

特别是,如乔恩已经写了 https://stackoverflow.com/a/19522634/296974,数据库连接对象在用作上下文管理器时创建事务。如果你想自动关闭连接,你可以这样做

with contextlib.closing(sqlite3.connect(':memory:')) as conn:
    with conn as cur:
        data = cur.execute('SELECT 1, SQLITE_VERSION()').fetchone()
        print(data)  # (1, "3.39.3")

    with conn as cur:
        [[two, version]] = cur.execute('SELECT 2, SQLITE_VERSION()')
        print(two, version)  # 2 3.39.3
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

请详细说明在这种情况下使用“WITH”而不是“TRY CATCH” 的相关文章

随机推荐