Я обнаружил, что с 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())
0
dcc310 9 Фев 2021 в 22:49

1 ответ

Лучший ответ

Вы запускаете несколько одновременных процессов Python. Каждый из них пытается создать или открыть базу данных на диске в местоположении dw.db. Это не сработает, потому что процессы встроенной базы данных не знают друг друга.

С помощью базовой библиотеки C monetdbe можно писать многопоточные приложения, в которых каждый поток подключающегося приложения использует свой собственный объект подключения. См. Этот пример, написанный на C, здесь. Опять же, это работает только для параллельных потоков в одном процессе monetdbe, а не для нескольких одновременных процессов monetdbe, требующих одно и то же расположение базы данных.

К сожалению, в настоящее время невозможно настроить модуль Python monetdbe, аналогичный приведенному выше примеру C. Но наверное в следующем выпуске можно будет использовать, например, concurrent.futures, чтобы написать что-то подобное на Python.

1
Aris Koning 11 Фев 2021 в 09:03