Aktualisierung: Siehe auch das SQLAlchemy-Verwendungsrezept hier
Das Erstellen einer (schreibgeschützten, nicht materialisierten) Ansicht wird meines Wissens nicht standardmäßig unterstützt. Das Hinzufügen dieser Funktionalität in SQLAlchemy 0.7 ist jedoch unkompliziert (ähnlich dem Beispiel, das ich hier gegeben habe). Sie müssen nur eine Compiler-Erweiterung CreateView
schreiben . Mit dieser Erweiterung können Sie dann schreiben (vorausgesetzt, dass t
ist ein Tabellenobjekt mit einer Spalte id
)
createview = CreateView('viewname', t.select().where(t.c.id>5))
engine.execute(createview)
v = Table('viewname', metadata, autoload=True)
for r in engine.execute(v.select()):
print r
Hier ist ein funktionierendes Beispiel:
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(t.c.id>5))
engine.execute(createview)
# reflect view and print result
v = Table('viewname', metadata, autoload=True)
for r in engine.execute(v.select()):
print r
Wenn Sie möchten, können Sie sich auch auf einen Dialekt spezialisieren, z. B.
@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)
)