Ich habe versucht herauszufinden, wie die Liste der in einem SQLAlchemy-Modell definierten Spalten durchlaufen werden kann. Ich möchte, dass einige Serialisierungs- und Kopiermethoden in einige Modelle geschrieben werden. Ich kann nicht einfach darüber iterieren, obj.__dict__
da es viele SA-spezifische Elemente enthält.
Kennt jemand einen Weg, um nur die id
und desc
Namen von den folgenden zu bekommen?
class JobStatus(Base):
__tablename__ = 'jobstatus'
id = Column(Integer, primary_key=True)
desc = Column(Unicode(20))
In diesem kleinen Fall könnte ich leicht ein:
def logme(self):
return {'id': self.id, 'desc': self.desc}
aber ich würde etwas bevorzugen, das das automatisch generiert dict
(für größere Objekte).
quelle
__table__.columns
dass Sie die SQL-Feldnamen erhalten, nicht die Attributnamen, die Sie in Ihren ORM-Definitionen verwendet haben (falls sich die beiden unterscheiden).'_sa_' != k[:4]
zunot k.startswith('_sa_')
?inspect(JobStatus).columns.keys()
Sie können die Liste der definierten Eigenschaften aus dem Mapper abrufen. Für Ihren Fall interessieren Sie sich nur für ColumnProperty-Objekte.
quelle
class_mapper
muss importiert werden vonsqlalchemy.orm
inspect()
, die genau das gleiche Mapper-Objekt wie zurückgibtclass_mapper()
. docs.sqlalchemy.org/en/latest/core/inspection.htmlMir ist klar, dass dies eine alte Frage ist, aber ich bin gerade auf dieselbe Anforderung gestoßen und möchte zukünftigen Lesern eine alternative Lösung anbieten.
Als Josh Notizen, werden die vollen SQL - Feldnamen durch zurückgegeben werden
JobStatus.__table__.columns
, also eher als der ursprünglichen Feldnamen ID , erhalten Sie jobstatus.id . Nicht so nützlich wie es sein könnte.Die Lösung zum Abrufen einer Liste von Feldnamen, wie sie ursprünglich definiert wurden, besteht darin, das
_data
Attribut auf dem Spaltenobjekt zu suchen , das die vollständigen Daten enthält. Wenn wir uns das ansehenJobStatus.__table__.columns._data
, sieht es so aus:Von hier aus können Sie einfach anrufen
JobStatus.__table__.columns._data.keys()
, um eine schöne, saubere Liste zu erhalten:quelle
self.__table__.columns
gibt Ihnen "nur" die in dieser bestimmten Klasse definierten Spalten, dh ohne geerbte. Wenn Sie alle brauchen, verwenden Sieself.__mapper__.columns
. In Ihrem Beispiel würde ich wahrscheinlich so etwas verwenden:quelle
Angenommen, Sie verwenden die deklarative Zuordnung von SQLAlchemy, können Sie das
__mapper__
Attribut verwenden, um zum Klassen-Mapper zu gelangen. So erhalten Sie alle zugeordneten Attribute (einschließlich Beziehungen):Wenn Sie ausschließlich Spaltennamen möchten, verwenden Sie
obj.__mapper__.column_attrs.keys()
. Weitere Ansichten finden Sie in der Dokumentation.https://docs.sqlalchemy.org/en/latest/orm/mapping_api.html#sqlalchemy.orm.mapper.Mapper.attrs
quelle
Um eine
as_dict
Methode für alle meine Klassen zu erhalten, habe ich eineMixin
Klasse verwendet, die die von Ants Aasma beschriebenen Techniken verwendet .Und dann benutze es so in deinen Klassen
Auf diese Weise können Sie für eine Instanz von Folgendes aufrufen
MyClass
.Hoffe das hilft.
Ich habe ein bisschen weiter damit herumgespielt, ich musste meine Instanzen tatsächlich
dict
als die Form eines HAL-Objekts mit seinen Links zu verwandten Objekten rendern . Also habe ich hier unten diese kleine Magie hinzugefügt, die über alle Eigenschaften der Klasse wie oben kriecht, mit dem Unterschied, dass ich tiefer inRelaionship
Eigenschaften krieche undlinks
diese automatisch generiere .Bitte beachten Sie, dass dies nur für Beziehungen mit einem einzigen Primärschlüssel funktioniert
quelle
from sqlalchemy.orm import class_mapper, ColumnProperty
oben auf Ihrem Code-SnippetGibt ein Diktat zurück, bei dem Schlüssel Attributnamen sind und die Werte des Objekts.
/! \ es gibt ein zusätzliches Attribut: '_sa_instance_state', aber du kannst damit umgehen :)
quelle
Ich weiß, dass dies eine alte Frage ist, aber was ist mit:
Um dann Spaltennamen zu erhalten:
jobStatus.columns()
Das würde zurückkehren
['id', 'desc']
Dann können Sie eine Schleife durchlaufen und Dinge mit den Spalten und Werten tun:
quelle