是否可以使用SqlAlchemy中的mapper与类映射视图?

Sye*_*b M 9 python orm sqlalchemy python-2.7

正如我在这里提到的,我创建了View.

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

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

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

mapper(ViewName, v)
Run Code Online (Sandbox Code Playgroud)

Sye*_*b M 15

最后我发现了它.

我们可以为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
        )
Run Code Online (Sandbox Code Playgroud)

而已.我们可以使用ViewName类访问"viewname"表.

感谢所有回复我的人.


ste*_*han 11

您可以执行此操作,但必须手动定义主键.假设这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
Run Code Online (Sandbox Code Playgroud)

要对此进行测试,请在上面链接的答案中将此代码段粘贴到我的工作示例的末尾.有关更多详细信息,请参阅文档(例如,您可以使用属性来定义外键).

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

v = Table('viewname', metadata, Column('id', Integer, primary_key=True), autoload=True)
Run Code Online (Sandbox Code Playgroud)

即,已经在表定义中添加主键.然后你不需要在你的问题中的primary_key参数orm.mapper,你的问题中的其余代码开箱即用.

  • 为此道歉.如果我错了,请纠正我.我混合了你的代码和@van代码.以下是适合我的作品.`class ViewName(Base):__ table__ = Table('viewname',Base.metadata,Column('id',Integer,primary_key = True),autoload = True,autoload_with = engine)` (2认同)