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
Я немного сомневаюсь потому, что когда модель имеет много полей то кода для их поддержки становится слишком много.