如何使用SQLAlchemy创buildSQL视图?

一切都在标题中。 有没有“Pythonic”方法(我的意思是,没有“纯SQL”查询)来定义SQL视图与SQLAlchemy?

谢谢你的帮助,

更新:另请参阅这里的SQLAlchemy使用配方

就我所知,创build一个(只读的非物化)视图并不支持开箱即用。 但是在SQLAlchemy 0.7中添加这个function很简单(类似于我在这里给出的例子)。 你只需要编写一个编译器扩展 CreateView 。 有了这个扩展,你可以写(假设t是一个带有列id的表对象)

 createview = CreateView('viewname', t.select().where(tcid>5)) engine.execute(createview) v = Table('viewname', metadata, autoload=True) for r in engine.execute(v.select()): print r 

这是一个工作的例子:

 from sqlalchemy import Table from sqlalchemy.ext.compiler import compiles from sqlalchemy.sql.expression import Executable, ClauseElement class CreateView(Executable, ClauseElement): def __init__(self, name, select): self.name = name self.select = select @compiles(CreateView) def visit_create_view(element, compiler, **kw): return "CREATE VIEW %s AS %s" % ( element.name, compiler.process(element.select, literal_binds=True) ) # test data from sqlalchemy import MetaData, Column, Integer from sqlalchemy.engine import create_engine engine = create_engine('sqlite://') metadata = MetaData(engine) t = Table('t', metadata, Column('id', Integer, primary_key=True), Column('number', Integer)) t.create() engine.execute(t.insert().values(id=1, number=3)) engine.execute(t.insert().values(id=9, number=-3)) # create view createview = CreateView('viewname', t.select().where(tcid>5)) engine.execute(createview) # reflect view and print result v = Table('viewname', metadata, autoload=True) for r in engine.execute(v.select()): print r 

如果你想,你也可以专门为方言,例如

 @compiles(CreateView, 'sqlite') def visit_create_view(element, compiler, **kw): return "CREATE VIEW IF NOT EXISTS %s AS %s" % ( element.name, compiler.process(element.select, literal_binds=True) ) 

没有纯SQL的SQL视图? 您可以创build一个类或函数来实现定义的视图。

 function get_view(con): return Table.query.filter(Table.name==con.name).first()