sql >> Database >  >> RDS >> PostgreSQL

Hoe maak je een SQL-weergave met SQLAlchemy?

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)
         )


  1. Waarschuwingen en meldingen van SkySQL

  2. Onthoud dit bij het formatteren van een TIME-gegevenstype in SQL Server (T-SQL)

  3. jQuery Valideer het gebruik van de externe methode om te controleren of de gebruikersnaam al bestaat

  4. Parallel Go-tests uitgevoerd tegen een PostgreSQL-database die draait op Docker