具有inheritan的SQLAlchemy内省列类型

2024-03-29 13:50:41 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑到这段代码(并使用SQLAlchemy 0.7.7):

class Document(Base):
    __tablename__ = 'document'
    __table_args__ = {
        'schema': 'app'
    }

    id = Column(types.Integer, primary_key=True)
    nom = Column(types.Unicode(256), nullable=False)
    date = Column(types.Date())

    type_document = Column(types.Enum('arrete', 'photographie',
        name='TYPES_DOCUMENT_ENUM'))
    __mapper_args__ = {'polymorphic_on': type_document}

class Arrete(Document):
    __tablename__ = 'arrete'
    __table_args__ = {
        'schema': 'app'
    }
    __mapper_args__ = {'polymorphic_identity': 'arrete'}

    id = Column(types.Integer, ForeignKey('app.document.id'), primary_key=True)
    numero_arrete = Column(types.Integer)
    date_arrete = Column(types.Date())

我可以很容易地内省在Arrete类中定义的列的列类型:

Arrete.__table__.c['date_arrete'].type

但如果我想通过Arrete类访问在Document类中定义的列,则这不起作用。(如果我试图访问c['date'],则返回KeyError)。

是否有方法获取列类型,而不管该列是在最终类中定义的还是在其父类中定义的?


Tags: idappdate定义typetableargscolumn
3条回答

你可以探索基类。。。

def find_type(class_, colname):
    if hasattr(class_, '__table__') and colname in class_.__table__.c:
        return class_.__table__.c[colname].type
    for base in class_.__bases__:
        return find_type(base, colname)
    raise NameError(colname)

print find_type(Arrete, 'date_arrete')
print find_type(Arrete, 'date')

你需要abstract special directivemixin pattern

对于mixin,您可以使用以下内容:

class MyMixin(object):
    __tablename__ = 'document'
    __table_args__ = {
        'schema': 'app'
    }

    id = Column(types.Integer, primary_key=True)
    nom = Column(types.Unicode(256), nullable=False)
    date = Column(types.Date())

class Arrete(MyMixin, Base):
    __tablename__ = 'arrete'

    __mapper_args__ = {'polymorphic_identity': 'arrete'}

    foreign_id = Column(types.Integer, ForeignKey('app.document.id'), primary_key=True)
    numero_arrete = Column(types.Integer)
    date_arrete = Column(types.Date())


class Document(MyMixin, Base):
    __tablename__ = 'Document'
    type_document = Column(types.Enum('arrete', 'photographie',
        name='TYPES_DOCUMENT_ENUM'))
    __mapper_args__ = {'polymorphic_on': type_document}

共享的东西放在mixin中,非共享的东西放在子类中。

ORM允许您在继承模式中定义与两个表的连接相对应的类。这个结构是完全服务的,还可以用来查找基本的东西,比如列上的属性类型,非常直接:

type = Arrete.date.property.columns[0].type

请注意,这基本上与艰难通过__bases__的方法相同,只是您让Python的普通类机制来完成这项工作。

相关问题 更多 >