首页 > 解决方案 > 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())

标签: monetdb

解决方案


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

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

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


推荐阅读