PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara membuat Tampilan SQL dengan SQLAlchemy?

Pembaruan: Lihat juga resep penggunaan SQLAlchemy di sini

Membuat tampilan (hanya-baca yang tidak terwujud) sejauh yang saya tahu tidak didukung di luar kotak. Tetapi menambahkan fungsionalitas ini di SQLAlchemy 0.7 sangatlah mudah (mirip dengan contoh yang saya berikan di sini). Anda hanya perlu menulis ekstensi kompiler CreateView . Dengan ekstensi ini, Anda kemudian dapat menulis (dengan asumsi bahwa t adalah objek tabel dengan 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

Berikut adalah contoh kerja:

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

Jika mau, Anda juga dapat mengkhususkan diri untuk dialek, mis.

@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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menangani Query Lambat Dengan PostgreSQL

  2. pgDash Alternatives - Pemantauan Database PostgreSQL dengan ClusterControl

  3. Bagaimana Setseed() Bekerja di PostgreSQL

  4. Optimalkan kueri maksimum berdasarkan grup

  5. Anotasi hibernasi untuk tipe serial PostgreSQL