2013-12-11 6 views

Antwort

8

Sie können dies tun, aber Sie müssen einen Primärschlüssel manuell definieren. Unter der Annahme, dass id ist eine Spalte von v, die Sie als Primärschlüssel verwendet werden sollen (wie es der Fall in meinem original example code ist), das funktioniert:

from sqlalchemy import orm 

class ViewName(object): 
    def __init__(self, name): 
     self.name = name 

orm.mapper(ViewName, v, primary_key=[v.c.id]) 

Session = orm.sessionmaker(bind=engine) 
for r in Session().query(ViewName): 
    print r.id, r.number 

Um dies zu testen, fügen Sie einfach diesen Schnipsel am Ende meines Arbeitsbeispiel in der oben verlinkten Antwort. Weitere Details finden Sie unter the documentation (z. B. können Sie mithilfe von Eigenschaften Fremdschlüssel definieren).

EDIT (van in einem comment auf meine Antwort oben verlinkten): Alternativ können Sie die Ansicht definiton in meinem ursprünglichen Code ändern (und Ihre Frage) leicht und schreiben:

v = Table('viewname', metadata, Column('id', Integer, primary_key=True), autoload=True) 

dh Fügen Sie den Primärschlüssel bereits in der Tabellendefinition hinzu. Dann brauchen Sie nicht das primary_key Argument in der orm.mapper und der Rest des Codes in Ihrer Frage funktioniert out of the box.

+2

Entschuldigung dafür. Korrigiere mich, wenn ich falsch liege. Ich habe deinen Code und @van-Code gemischt. Das Folgende ist perfekt für mich. 'Klasse ViewName (Basis): __table__ = Tabelle ('viewname', Base.metadata, Spalte ('id', Integer, primary_key = True), autoload = True, autoload_with = engine)' –

+0

@SyedHabibM: ja, das funktioniert auch. Sie müssen nur den Primärschlüssel irgendwo definieren. – stephan

13

Endlich habe ich es gefunden.

Wir können Klasse für SQL-Ansichten erstellen. Hier ist ein einfaches Beispiel.

class ViewName(Base): 
    __table__ = Table('viewname', Base.metadata, 
     Column('id', Integer, primary_key=True), 
     Column('foreign_key', Integer, ForeignKey('sometablename.id'), 
      autoload=True, autoload_with=engine 
     ) 

Das ist es. Wir können mit der ViewName-Klasse auf die Tabelle "viewname" zugreifen.

Vielen Dank für alle, die mir antworten.

Verwandte Themen