现在一直在寻找这个答案,但我似乎无法找到它,因为一切都引用了连接表继承,我理解,但不想使用。我希望在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'
...
答案 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}