У меня проблемы с ZODB LockError
, но я считаю, что работаю с базой данных только с одним процессом.
Моя цель для моего проекта состоит в том, чтобы иметь только две функции, load_project()
и save_project()
, которые позволяют пользователю загружать объект Project
, работать с ним, а затем периодически сохранять его с помощью save_project()
без необходимости непосредственного взаимодействия пользователя с ZODB. Вроде как они просто работают над документом и сохраняют по ходу дела.
Однако я заметил, что я постоянно получаю LockError
: я могу загрузить объект, сохранить объект один раз, но затем я получаю LockError
всякий раз, когда пытаюсь сохранить его впоследствии. Очевидно, я что-то сделал не так или не понимаю, как работает ZODB. Как предотвратить это LockError
?
Все остальные проблемы с LockError на SO, по-видимому, связаны с несколькими процессами. Я взаимодействую с кодом через Jupyter Notebook, который, я считаю, представляет собой всего лишь один процесс. Когда я сталкиваюсь с LockError, я могу перезапустить ядро (запустив тем самым новый процесс), загрузить проект и снова его сохранить. Но тогда я не могу сохранить его во второй раз.
Вот код двух функций, которые я импортирую из своего модуля functions
:
def save_project(project: BIMProject):
"""
Commits the project to the ZODB; including opening and closing the connection
"""
if not hasattr(project, "filename"):
project.filename = input("Enter a filename (without extension):")
if not hasattr(project, "filepath"):
tk_root = Tk()
tk_root.withdraw()
project.filepath = filedialog.askdirectory(title="Please select a directory")
filename = project.filename
full_path = project.filepath + "/" + filename
storage=FileStorage(full_path)
db=ZODB.DB(storage)
connection=db.open()
root=connection.root()
if 'project' in root:
root.update({'project': project})
else:
root['project'] = project # reassign to change
transaction.commit()
connection.close()
def load_project():
"""
Loads a project from a database file
"""
tk_root = Tk()
tk_root.withdraw()
filepath = filedialog.askopenfilename(title="Please select a database file")
storage = FileStorage(filepath)
db = ZODB.DB(storage)
connection = db.open()
root = connection.root()
project = copy.deepcopy(root["project"])
connection.close()
db.close()
return project
Любая помощь будет принята с благодарностью.