Python 是否可以在SqlAlchemy中使用映射器将视图映射到类?

Python 是否可以在SqlAlchemy中使用映射器将视图映射到类?,python,python-2.7,orm,sqlalchemy,Python,Python 2.7,Orm,Sqlalchemy,是否可以创建用于会话的视图类 v = Table('viewname', metadata, autoload=True) class ViewName(object): def __init__(self, name): self.name = name mapper(ViewName, v) 可以这样做,但必须手动定义主键。假设id是要用作主键的v列(与my中的情况相同),则此操作有效: from sqlalchemy import orm class View

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

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

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

mapper(ViewName, v)

可以这样做,但必须手动定义主键。假设
id
是要用作主键的
v
列(与my中的情况相同),则此操作有效:

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
为了测试这一点,只需将这段代码粘贴在上面链接的答案中我的工作示例的末尾。有关更多详细信息,请参见(例如,您可以使用属性定义外键)

编辑(上文链接到我的答案中的van): 或者,您可以稍微更改我的原始代码(以及您的问题)中的视图定义,并编写:

v = Table('viewname', metadata, Column('id', Integer, primary_key=True), autoload=True)
i、 例如,已在表定义中添加主键。然后您就不需要
orm.mapper
中的
primary\u key
参数了,问题中的其余代码都是现成的。

最后我找到了它

我们可以为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”表


感谢所有回复我的人。

对此表示歉意。如果我错了,请纠正我。我把你的代码和@van代码混在一起了。以下是适合我的作品<代码>类ViewName(Base):\uuuuuu table\uuuuu=table('ViewName',Base.metadata,Column('id',Integer,primary\u key=True),autoload=True,autoload\u with=engine)@SyedHabibM:是的,这也可以。您只需要在某个地方定义主键。这如何与create\u all/drop\u all结合使用?当前drop\u all失败,因为它试图删除一个表,而该表实际上是一个视图。@fgblomqvist:(…续)如果您只关注使用
CreateView
创建的视图,您还可以扩展
@compiles(DropTable)
以基本检查它是否是您的视图之一,然后调用
编译器。访问\u drop\u视图(element,**kw)
,否则调用
编译器。访问drop\u table(element,**kw)
(其中
访问drop\u view
必须由您添加)。这就是说,您会发现视图不能像预期的那样工作,因为(doh)视图不是表;)@stephan我确实最终扩展了
@compiles(DropTable)
和--惊喜--访问\u删除\u视图已经存在!但是,是的,我要做的是在表上设置一个attr(is_视图),然后检查它。工作起来很有魅力。