我的系统:

  • 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相关问答推荐

从流程获取定期更新

Pandas 密集排名具有相同值,按顺序排列

Asyncio与队列的多处理通信-仅运行一个协程

带有Postgres的Flask-Data在调用少量API后崩溃

如何将uint 16表示为float 16

使用Python Cerberus初始化一个循环数据 struct (例如树)(v1.3.5)

在使用Guouti包的Python中运行MPP模型时内存不足

具有症状的分段函数:如何仅针对某些输入值定义函数?

根据网格和相机参数渲染深度

比较两个二元组列表,NP.isin

提取两行之间的标题的常规表达

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

使用miniconda创建环境的问题

基于字符串匹配条件合并两个帧

Asyncio:如何从子进程中读取stdout?

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

Django RawSQL注释字段

Pandas GroupBy可以分成两个盒子吗?

在方法中设置属性值时,如何处理语句不可达[Unreacable]";的问题?

基于Scipy插值法的三次样条系数