Совместное использование сеанса в PonyORM через другой модуль pythom
Первоначально я начал небольшой проект на Python (Python, Tkinter amd PonyORM) и стал больше, поэтому решил разделить код (раньше был только один файл) на несколько модулей (например, main, form1, entity, database). Main, выступающий в качестве основного контроллера, form1 в качестве примера может содержать фрейм tkinter, который может использоваться как интерфейс, в который пользователь может вводить данные, а сущность содержит отображения db.Enttiy и базу данных для экземпляра pony.Database вместе с деталями его соединения., Я думаю, проблема в том, что во время импорта я получаю эту ошибку "pony.orm.core.ERDiagramError: Невозможно определить сущность 'EmpInfo': сопоставление базы данных уже сгенерировано". Можете ли вы указать мне любой существующий код, как это должно быть сделано.
2 ответа
Возможно, вы импортируете свои модули в неправильном порядке. Любой модуль, который содержит определения сущностей, должен быть импортирован до db.generate_mapping()
вызов.
Я думаю тебе следует позвонить db.generate_mapping()
прямо перед входом tk.mainloop()
когда весь импорт уже сделан.
Хороший подход, чтобы избежать этого, вместо того, чтобы иметь db.generate_mapping()
вызов происходит в коде верхнего уровня модуля, есть функция, которую экспортирует модуль, который вызывает db.generate_mapping()
после того, как все другие модули были импортированы.
Шаблон, который я использую, это положить все мои db.Entity
подклассы в один модуль с именем model
а затем в нижней части model.py
является:
def setup():
""" Set up the database """
db.bind(**database_config, create_db=True)
db.generate_mapping(create_tables=True)
Эта функция вызывается собственным запуском моего приложения (которое также отвечает за настройку database_config
). Таким образом, правильный порядок импорта и настройки может быть гарантирован.
db
Сам объект также принадлежит этому model
модуль; если мне нужно использовать его где-то еще, я импортирую model
и использовать model.db
,
Если вы хотите еще больше отделить вещи (с разными классами моделей, живущими в разных модулях), вы можете иметь модуль, который владеет db
, затем ваши отдельные модули модели, а затем третий модуль, который импортирует db
и модели и обеспечивает setup
функция. Например, ваша структура каталогов может выглядеть так:
model/
__init__.py
- импортирует все подмодули модели и предоставляетsetup
функцияdb.py
- обеспечиваетdb
сам объект и любые общие объекты объектов, которые нужны всем остальнымform1.py
,form2.py
и др. - импортdb
и использует свой объект базы данных для определения сущностей
Тогда ваше основное приложение может сделать что-то вроде:
import model
model.setup()