Cập nhật: Xem thêm công thức sử dụng SQLAlchemy tại đây
Theo tôi biết, việc tạo chế độ xem (chỉ đọc không được hiện thực hóa) không được hỗ trợ. Nhưng việc thêm chức năng này trong SQLAlchemy 0.7 rất đơn giản (tương tự như ví dụ tôi đã đưa ra ở đây). Bạn chỉ cần viết một phần mở rộng trình biên dịch CreateView
. Với phần mở rộng này, bạn có thể viết (giả sử rằng t
là một đối tượng bảng có cộ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
Đây là một ví dụ hoạt động:
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
Nếu muốn, bạn cũng có thể chuyên về một phương ngữ, ví dụ:
@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)
)