nextel
@nextel
ненавижу javascript

Как разнести модели в одтельные файлы в PonyORM?

Здравствуйте,

есть файл

db = Database("sqlite:inmemory")

class Order(db.Entity):
    id = PrimaryKey(int, auto=True)
    date = Required(date)
    trnumber = Optional(str)
  


class People(db.Entity):
    id = PrimaryKey(int, auto=True)
    name = Required(str)
    lastname = Required(str)
    email = Required(str)
    telephone = Optional(str)
 
db.generate_mapping(create_tables=True)


когда все вместе в одном файле все работает, а когда разносишь две сущночсти по ранзым файлам при запуске валятся ошибки типа вот такой

Cannot define entity 'People': database mapping has already been generated


причем если в в этом же файлк наобьявлять еще сущностей то они спокойно создаются, а в создать в другом файле не получается почему то.
  • Вопрос задан
  • 354 просмотра
Решения вопроса 2
@metaprogrammer
Добрый день!

Ответ angru является правильным, я просто дам несколько дополнительных уточнений.

Как правильно сказано, generate_mapping() нужно вызывать один раз после того, как все сущности определены. После этого схема фиксируется и добавлять новые сущности в нее уже нельзя.

Когда объявляется класс сущности, то он становится доступен как атрибут объекта базы данных. То есть, если сущность опредена как:

db = Database()

class Person(db.Entity):
    name = Required(str)

то после этого можно ссылаться на нее так: db.Person. Например, в запросах:

select(p for p in db.Person if p.name.startswith('A'))

Поэтому импортировать модели в main.py необязательно - они уже доступны там как атрибуты объекта db.

Часть наиболее важных сущностей можно при желании определить в том же самом файле, где объявляется объект db.

Иногда может быть удобнее не объявлять параметры объекта Database сразу при его создании, а выполнять метод db.bind(...) непосредственно перед выполнением метода db.generate_mapping(...) - тогда одни и те же сущности могут использованы с разными типами баз данных (например, SQLite и MySQL).
Ответ написан
angru
@angru
по идее вам нужно вызывать db.generate_mapping(create_tables=True) в самый последний момент, т.е.:

# db.py:

from pony.orm import *


db = Database("sqlite", ":memory:")


# order.py:
from datatime import time

from pony.orm import *

from db import db


class Order(db.Entity):
    id = PrimaryKey(int, auto=True)
    date = Required(date)
    trnumber = Optional(str)


# people.py:

from pony.orm import *

from db import db


class People(db.Entity):
    id = PrimaryKey(int, auto=True)
    name = Required(str)
    lastname = Required(str)
    email = Required(str)
    telephone = Optional(str)


# main.py

from db import db
from people import People # обязательно импортировать все модели, чтобы они определились до генерации маппинга
from order import Order


def main():
    db.generate_mapping(create_tables=True)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@mgremlin
Бизнес в и вокруг IT
задай вопрос автору - metaprogrammer на хабре 8-)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы