Существует два (три, но я не считаю эликсира , поскольку это не "официальный") способа определения постоянного объекта с помощью SQLAlchemy :
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
from sqlalchemy.orm import mapper
metadata = MetaData()
users_table = Table('users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
)
class User(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return "<User('%s')>" % (self.name)
mapper(User, users_table) # <Mapper at 0x...; User>
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
def __init__(self, name):
self.name = name
def __repr__(self):
return "<User('%s')>" % (self.name)
Я вижу, что при использовании объектов mapper я полностью отделяю определение ORM от бизнес-логики, а при использовании декларативного синтаксиса всякий раз, когда я изменяю класс бизнес-логики, я могу редактировать класс базы данных (который в идеале должен немного редактировать).
В чем я не совсем уверен, какой подход более удобен для бизнес-приложений?
Мне не удалось найти сравнение между двумя методами картирования, чтобы решить, какой из них лучше подходит для моего проекта.
Я склоняюсь к использованию «обычного» способа (то есть не декларативного расширения), так как это позволяет мне «скрывать» и не допускать бизнес-представления ко всей логике ORM, но я хотел бы услышать убедительные аргументы для обоих подходов.