अपडेट करें: यहां SQLAlchemy उपयोग नुस्खा भी देखें
जहां तक मुझे पता है, बॉक्स से बाहर (केवल-पढ़ने के लिए गैर-भौतिक) दृश्य बनाना समर्थित नहीं है। लेकिन SQLAlchemy 0.7 में इस कार्यक्षमता को जोड़ना सीधा है (उदाहरण के लिए मैंने यहां दिया है)। आपको बस एक कंपाइलर एक्सटेंशन लिखना है CreateView
. इस एक्सटेंशन के साथ, आप तब लिख सकते हैं (यह मानते हुए कि t
एक कॉलम के साथ एक टेबल ऑब्जेक्ट है 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
यहां एक कार्यशील उदाहरण दिया गया है:
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
यदि आप चाहें, तो आप किसी बोली के विशेषज्ञ भी हो सकते हैं, उदा.
@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)
)