gpt4 book ai didi

python - sqlite - 与文件一起工作,死于 :memory:

转载 作者:IT王子 更新时间:2023-10-29 06:25:16 26 4
gpt4 key购买 nike

我的脚本在使用 SQLite 时测试失败基础(通过 sqlalchemy )在 :memory: 中创建,并在使用物理文件创建的基础时通过测试。

脚本是多线程的。我知道将 SQLite 与多线程(锁定等)一起使用并不是最好的主意,但我使用 SQLite 仅测试脚本的数据库接口(interface)。

当我使用 :memory: 时,脚本死了,提示没有表:

OperationalError: (OperationalError)
no such table: content_info u'INSERT INTO content_info ...

测试过程(带nose)如下:

def setup_database():
global global_engine
# create database columns
engine = sqlalchemy.create_engine(...)
Base.metadata.create_all(engine)
global_engine = engine

@with_setup(setup_database)
def test_task_spoolers():
check_database_content_from_another_thread()

def check_database_content_from_another_thread():
global global_engine
# from within other thread
# create new session using global_engine
# do some inserts

所以在设置中我确实创建了数据库和列。我也可以在日志中看到它 (echo=True):

12:41:08 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE content_info (...

12:41:08 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
12:41:08 INFO sqlalchemy.engine.base.Engine INSERT INTO
content_info (base_id, request_id, timestamp, ...
12:41:08 INFO sqlalchemy.engine.base.Engine (0, 0, 0, 'dummy_variant',
None, 0)
12:41:08 INFO sqlalchemy.engine.base.Engine ROLLBACK
Exception in thread Thread-1:
Traceback (most recent call last):
OperationalError: (OperationalError)
no such table: content_info u'INSERT INTO ...

我的猜测是,当我在线程 A 中创建基础,然后在线程 B 中使用它时,然后 B 在实际创建之前就开始对基础进行操作。但是,我在 create_all 之后添加了 time.sleep(3) 但它不起作用。

并且,如前所述,当我使用文件而不是 :memory: 时,即使文件位于虚拟分区(因此,实际上是在内存中),它也能正常工作。知道这是为什么吗?

最佳答案

您不能创建到内存数据库的多个连接。相反,与 :memory: 的新连接会创建一个数据库。

来自SQLite documentation :

Every :memory: database is distinct from every other. So, opening two database connections each with the filename ":memory:" will create two independent in-memory databases.

这与磁盘上的数据库不同,后者使用相同的连接字符串创建多个连接意味着您正在连接到一个数据库。

您正在为该线程创建一个新连接,从而创建一个没有创建表的数据库。

关于python - sqlite - 与文件一起工作,死于 :memory:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15681387/

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