PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да създадете SQL изглед с SQLAlchemy?

Актуализация: Вижте също рецептата за използване на 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да промените собствеността на всички обекти в определена схема в PostgreSQL?

  2. Основно наблюдение на PostgreSQL – част 2

  3. XMLTABLE в PostgreSQL

  4. Как да променя позицията на колона в таблица с база данни на PostgreSQL?

  5. Как да импортирам данни от CSV в таблица на Postgres с помощта на pgAdmin 3?