Совместное использование сеанса в 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()
Другие вопросы по тегам