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.
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)' –
@SyedHabibM: ja, das funktioniert auch. Sie müssen nur den Primärschlüssel irgendwo definieren. – stephan