sql >> データベース >  >> RDS >> PostgreSQL

SQLAlchemyでSQLビューを作成するにはどうすればよいですか?

    更新: こちらの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)
             )
    


    1. テーブルまたは列の名前を数値で始めることはできませんか?

    2. SQLのデータ型のサイズを変更します

    3. SELECTステートメントでBOOLEAN型を使用する方法

    4. SQLチュートリアル:SQLを学ぶためのワンストップソリューション