将SQLAlchemy映射类与python中的功能类分开

时间:2015-08-02 16:29:10

标签: python orm sqlalchemy

我确信之前有过这方面的问题,我只是没有找到合适的关键字......

将ORM映射类与用于在应用程序中处理的类分开是否被视为好/坏做法?

例如:

class Artist:
    def __init__(self, name, age, genre):
        self.name  = name
        self.age   = age
        self.genre = genre
        self.score = None # Calculated in real-time, never stored to DB

class ArtistM(Base):
    __tablename__ = "artists"
    name          = Column(String(50))
    age           = Column(Integer)
    genre         = Column(String(50))

可以想象的好处是保持主应用程序使用的类完全不受ORM的影响。例如,假设我创建了一个Artist类和一整套在该类上运行的工具。稍后,我想开始处理很多这些对象并决定添加一个数据库组件。我想返回并修改原始的Artist类或在顶部创建新的映射类吗?

1 个答案:

答案 0 :(得分:0)

使用继承来实现这一目标:

# Option-1: use ArtistM everywhere
class ArtistM(Artist, Base):
    # ...

# Option-2: use Artist everywhere
class Artist(ArtistM):
    # ...

我更喜欢选项1,因为它不会使用持久相关信息 类。在您的代码中,您甚至可以使用名称导入它们,以便您可以互换使用其他代码:

from mypuremodule import Artist
# or
from mymixedinmodule import ArtistM as Artist
# then use 'Artist` everywhere