gpt4 book ai didi

python - WindowsError 关闭后移动 sqlite3 数据库

转载 作者:可可西里 更新时间:2023-11-01 11:18:10 24 4
gpt4 key购买 nike

这是我的问题的一个简化示例:

import os
import sqlite3

with sqlite3.connect('test.db.temp') as db:
db.executescript('CREATE TABLE foo (bar);')
os.rename('test.db.temp', 'test.db')

输出:

> python test.py
Traceback (most recent call last):
File "test.py", line 7, in <module>
os.rename('test.db.temp', 'test.db')
WindowsError: [Error 32] The process cannot access the file because it is being used by another process

背景:我正在尝试以“原子”方式创建数据库,最简单的方法是在临时位置创建数据库,然后移动它。

最佳答案

问题是连接对象的上下文管理器似乎不起作用。

它是这样工作的:

db = sqlite3.connect('test.db.temp')
db.executescript('CREATE TABLE foo (bar);')
db.close()
os.rename('test.db.temp', 'test.db')

值得研究的是为什么它首先实现了 __enter__/__exit__...

更新:来自这个answer它看起来像 with 与 SQLite 一起使用时执行事务,因此您的代码类似于:

db = sqlite3.connect('test.db.temp')
db.begin_transaction()
db.executescript('CREATE TABLE foo (bar);')
db.commit()
os.rename('test.db.temp', 'test.db')

所以数据库在重命名时仍然很明显是打开的。推荐的代码将类似于:

with contextlib.closing(sqlite3.connect('test.db.temp')) as db:
db.executescript('CREATE TABLE foo (bar);')
os.rename('test.db.temp', 'test.db')

关于python - WindowsError 关闭后移动 sqlite3 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28032694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com