SQLAlchemy - 多个类,相同的表

时间:2015-08-05 16:55:45

标签: python database class object sqlalchemy

现在一直在寻找这个答案,但我似乎无法找到它,因为一切都引用了连接表继承,我理解,但不想使用。我希望在SQLAlchemy中创建多个类,这些类在表构造中是相同的,只是在类名和数据库表名中有所不同。我故意将表分开而不使用鉴别​​器,因为我希望这些表增长到非常大的尺寸。表格模式也有可能随着时间的推移缓慢发散,一些字段添加到一个而不是另一个。

我知道下面的代码不起作用,因为SQLAlchemy试图为连接表继承找到一个外键而不是让它们成为独立的表,但它基本上就是我想要的。我已经浏览了文档,但无法找到正确实现此方法的方法。有没有办法(或多种方式)来做到这一点?

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class HDD(Base):
    """Class representing a hard drive."""

    __tablename__ = 'HDDs'

    _id = Column(
        Integer,
        doc="Auto-incrementing primary key",
        name="id",
        primary_key=True)
    manufacturer = Column(
        String(40),
        doc="Hard drive manufacturer.")
    ...

class SDD(HDD):
    __tablename__ = 'SSDs'
    ...

3 个答案:

答案 0 :(得分:2)

在基类上使用__abstract__ = True但没有__tablename__,并从中继承。

class HDD(Base):
    __abstract__ = True
    _id = ...

class SDD(HDD):
    __tablename__ = 'SSDs'

class SSD2(HDD):
    __tablename = 'SSDs2'

答案 1 :(得分:0)

这看起来像Concrete Table Inheritance,如SQLAlchemy docs的Mapping Class Inheritance Hierarchies一章中所述。

答案 2 :(得分:0)

这是我最终得到这个工作的方式,来自freenode上来自#sqlalchemy的inklesspen的帮助。 (谢谢!)

class ComponentMixin(object):
    """Pythonic Mixin that defines columns common to most component types."""

    _id = Column(
        Integer,
        doc="Auto-incrementing primary key",
        name="id",
        primary_key=True)
    ....

    @declared_attr
    def _server_id(self):  # pylint: disable=R0201
        """
        Foreign key to owning server.

        MUST BE A DECLARED_ATTR since it's a foreign key!
        """

下面的子类继承:

class HDD(ComponentMixin, ConcreteBase, Base):
    """Class representing a hard drive."""

    __tablename__ = 'HDDs'

    __mapper_args__ = {
        'polymorphic_identity': 'hdd',
        'concrete': True}