monetdbe:多连接读取与写入

问题描述

我发现使用 monetdbe(嵌入式,Python),我可以从两个进程同时将数据导入两个表,但我不能执行两个 SELECT 查询

例如,如果我在 Bash 中运行它:

(python stdinquery.py < sql_examples/wind.sql &); (python stdinquery.py < sql_examples/first_event_by_day.sql &)

然后我从一个进程中得到这个错误,而另一个进程完成了它的查询

monetdbe.exceptions.OperationalError: Failed to open database: MALException:monetdbe.monetdbe_startup:GDKinit() Failed (code -2)

我有点惊讶它可以一次写入两个表但不能一次读取两个表。我是不是忽略了什么?

我的 stdinquery.py 只是:

import sys
import monetdbe

monet_conn = monetdbe.connect("dw.db")
cursor = monet_conn.cursor()
query = sys.stdin.read()
cursor.executescript(query)
print(cursor.fetchdf())

解决方法

您正在启动多个并发 Python 进程。每个都尝试在磁盘上的 dw.db 位置创建或打开数据库。这是行不通的,因为嵌入式数据库进程彼此不知道。

使用 monetdbe 的核心 C 库,可以编写多线程应用程序,其中每个连接的应用程序线程使用自己的连接对象。请参阅此用 C here 编写的示例。同样,这仅适用于单个 monetdbe 进程中的并发线程,而不适用于声明同一数据库位置的多个并发 monetdbe 进程。

遗憾的是,目前无法使用 Python monetdbe 模块来设置类似于上述 C 示例的内容。但可能在下一个版本中 将可以使用例如concurrent.futures 用 Python 编写类似的东西。