Bijwerken: Zie ook het SQLAlchemy-gebruiksrecept hier
Het maken van een (alleen-lezen niet-gematerialiseerde) weergave wordt voor zover ik weet niet standaard ondersteund. Maar het toevoegen van deze functionaliteit in SQLAlchemy 0.7 is eenvoudig (vergelijkbaar met het voorbeeld dat ik hier gaf). Je hoeft alleen maar een compiler-extensie te schrijven CreateView
. Met deze extensie kunt u vervolgens schrijven (ervan uitgaande dat t
is een tabelobject met een kolom 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 is een werkend voorbeeld:
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
Als je wilt, kun je je ook specialiseren in een dialect, bijvoorbeeld
@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)
)