SQLAlchemy database logic

У меня есть проект который использует SQLAlchemy как орм. Существует несколько таблиц:

Guild:
    __tablename__ = 'guild'

    id = Column(BigInteger, primary_key=True)

    name = Column(String(256))
   
    @staticmethod
    def get_or_create(id: int) -> Guild:
        instance = sql.session.query(Guild).get(id)

        if instance is None:
            instance = Guild(id=id)

            sql.session.add(instance)
            sql.session.commit()

        return instance

Channel:
    __tablename__ = 'channel'
    id = Column(BigInteger, primary_key=True)
    
    guild_id = Column(BigInteger, ForeignKey('guild.id'))
    guild = relationship('Guild')
   
    name = Column(String(256))

    @staticmethod
    def get_or_create(id: int) -> Channel:
        instance = sql.session.query(Channel).get(id)

        if instance is None:
            instance = Channel(id=id)

            sql.session.add(instance)
            sql.session.commit()

        return instance

Когда я должен добавить guild_id в поле guild_id таблицы Channel, я должен быть уверен что запись Guild с таким id уже есть в базе данных. Когда проект растет становится тяжело отслеживать это.

Будет ли правильным следующий код с архитектурной точки зрения?

Channel:
    __tablename__ = 'channel'
    id = Column(BigInteger, primary_key=True)

    guild_id = Column(BigInteger, ForeignKey('guild.id'))
    guild = relationship('Guild')

    name = Column(String(256))

    @staticmethod
    def get_or_create(id: int) -> Channel:
        instance = sql.session.query(Channel).get(id)

        if instance is None:
            instance = Channel(id=id)

            sql.session.add(instance)
            sql.session.commit()

        return instance

    @staticmethod
    def update_or_craete(id: int, guild_id: Optional[int] = None, name: Optional[str] = None) -> Channel:
        instance = Channel.get_or_create(id)
    
        if guild_id is not None:
            guild = Guild.get_or_create(guild_id)
            insatnce.guild_id = guild_id
  
        if name is not None:
            instance.name = name

        sql.session.commit()

        return instance

Я немного сомневаюсь потому, что когда модель имеет много полей то кода для их поддержки становится слишком много.


Ответы (0 шт):