可以使用SqlAlchemy中的映射器将视图与类映射吗?

问题描述 投票:0回答:2

正如这里提到的,我创建了视图。

以下是否可以创建用于会话的视图类?

v = Table('viewname', metadata, autoload=True)

class ViewName(object):
    def __init__(self, name):
       self.name = name

mapper(ViewName, v)
python python-2.7 orm sqlalchemy
2个回答
25
投票

终于找到了。

我们可以为 sql 视图创建类。这是一个简单的例子。

class ViewName(Base):
    __table__ = Table(
        'viewname', 
        Base.metadata,
        Column('id', Integer, primary_key=True),
        Column('foreign_key', Integer, ForeignKey('sometablename.id'),
        autoload=True, autoload_with=engine
    )

就是这样。我们可以使用 ViewName 类访问“viewname”表。

谢谢所有回复我的人。


15
投票

您可以这样做,但您必须手动定义主键。假设

id
v
的一列,您想将其用作主键(如我的 原始示例代码 中的情况),这是有效的:

from sqlalchemy import orm

class ViewName(object):
    def __init__(self, name):
       self.name = name

orm.mapper(ViewName, v, primary_key=[v.c.id])

Session = orm.sessionmaker(bind=engine)
for r in Session().query(ViewName):
    print r.id, r.number

要测试这一点,只需将此片段粘贴到上面链接的答案中我的工作示例的末尾即可。请参阅文档了解更多详细信息(例如,您可以使用属性来定义外键)。

编辑(在上面链接的我的答案的评论中): 或者,您可以稍微更改我的原始代码(和您的问题)中的视图定义并写入:

v = Table('viewname', metadata, Column('id', Integer, primary_key=True), autoload=True)

即,已经在表定义中添加主键。那么您不需要

primary_key
中的
orm.mapper
参数,并且问题中的其余代码可以开箱即用。

© www.soinside.com 2019 - 2024. All rights reserved.