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_视图),然后检查它。工作起来很有魅力。