我的系统:

  • Windows 10 x64
  • Python版本3.9.4
  • 标准库中集成的Sqlite3模块

DB连接和游标都被认为是资源,因此我可以使用with子句.

我知道,如果我在with个块中打开一个资源,它将自动关闭在它之外(文件是这样工作的).

如果这些假设是正确的,为什么我甚至可以从with块之外访问连接或游标?

试试这个:

import sqlite3

with sqlite3.connect('test.db') as conn:
    cur = conn.cursor()
    # some code here....


# Now we are outside with block but I can still use conn and cur
cur.execute('''CREATE TABLE IF NOT EXISTS users 
            (name TEST, surname TEXT) ''')
cur2 = conn.cursor() 

推荐答案

上下文管理器在退出时不对连接进行close操作;它要么提交最后一个事务(如果没有引发异常),要么回滚该事务.从documentation人开始:

Note上下文管理器既不隐式打开新事务,也不关闭连接.如果您需要结束上下文管理器,请考虑使用contextlib.closing().

由于没有与with语句相关联的新作用域,因此conncur仍在该语句后面的作用域中.

如果您使用want语句关闭连接,请按照文档建议的操作进行操作:

from contextlib import closing


with closing(sqlite3.connect('test.db')) as conn:
    ...

Python相关问答推荐

try 与gemini-pro进行多轮聊天时出错

如何访问所有文件,例如环境变量

将输入管道传输到正在运行的Python脚本中

使用groupby Pandas的一些操作

有没有一种方法可以从python的pussompy比较结果中提取文本?

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

如何使用scipy的curve_fit与约束,其中拟合的曲线总是在观测值之下?

dask无groupby(ddf. agg([min,max])?''''

ruamel.yaml dump:如何阻止map标量值被移动到一个新的缩进行?

找到相对于列表索引的当前最大值列表""

交替字符串位置的正则表达式

如何过滤组s最大和最小行使用`transform`'

当输入是字典时,`pandas. concat`如何工作?

为什么后跟inplace方法的`.rename(Columns={';b';:';b';},Copy=False)`没有更新原始数据帧?

SpaCy:Regex模式在基于规则的匹配器中不起作用

以极轴表示的行数表达式?

使用xlsxWriter在EXCEL中为数据帧的各行上色

某些值的数值幂和**之间的差异

跨两个数据帧收集非索引列上的公共组

使用_in链接操作管道传输的中间结果是否可用于链中的后续函数?