J'ai essayé de comprendre comment parcourir la liste des colonnes définies dans un modèle SQLAlchemy. Je le veux pour écrire des méthodes de sérialisation et de copie sur quelques modèles. Je ne peux pas simplement parcourir le obj.__dict__
car il contient beaucoup d'éléments spécifiques à SA.
Quelqu'un connaît-il un moyen d'obtenir simplement les noms id
et les desc
noms suivants?
class JobStatus(Base):
__tablename__ = 'jobstatus'
id = Column(Integer, primary_key=True)
desc = Column(Unicode(20))
Dans ce petit cas, je pourrais facilement créer un:
def logme(self):
return {'id': self.id, 'desc': self.desc}
mais je préférerais quelque chose qui génère automatiquement le dict
(pour les objets plus grands).
la source
__table__.columns
cela vous donnera les noms de champs SQL, pas les noms d'attributs que vous avez utilisés dans vos définitions ORM (si les deux diffèrent).'_sa_' != k[:4]
pournot k.startswith('_sa_')
?inspect(JobStatus).columns.keys()
Vous pouvez obtenir la liste des propriétés définies à partir du mappeur. Pour votre cas, seuls les objets ColumnProperty vous intéressent.
la source
class_mapper
doit être importé desqlalchemy.orm
inspect()
, qui renvoie exactement le même objet mappeur queclass_mapper()
. docs.sqlalchemy.org/en/latest/core/inspection.htmlJe me rends compte que c'est une vieille question, mais je viens de rencontrer la même exigence et je voudrais proposer une solution alternative aux futurs lecteurs.
Comme le note Josh, les noms de champ SQL complets seront retournés par
JobStatus.__table__.columns
, donc plutôt que l' id du nom de champ d'origine , vous obtiendrez jobstatus.id . Pas aussi utile que cela pourrait être.La solution pour obtenir une liste de noms de champs tels qu'ils ont été définis à l'origine consiste à rechercher l'
_data
attribut sur l'objet de colonne, qui contient les données complètes. Si nous regardonsJobStatus.__table__.columns._data
, cela ressemble à ceci:De là, vous pouvez simplement appeler
JobStatus.__table__.columns._data.keys()
ce qui vous donne une belle liste propre:la source
self.__table__.columns
vous donnera "seulement" les colonnes définies dans cette classe particulière, c'est-à-dire sans celles héritées. si vous avez besoin de tout, utilisezself.__mapper__.columns
. dans votre exemple, j'utiliserais probablement quelque chose comme ceci:la source
En supposant que vous utilisez le mappage déclaratif de SQLAlchemy, vous pouvez utiliser l'
__mapper__
attribut pour accéder au mappeur de classe. Pour obtenir tous les attributs mappés (y compris les relations):Si vous voulez des noms de colonnes strictement, utilisez
obj.__mapper__.column_attrs.keys()
. Consultez la documentation pour d'autres vues.https://docs.sqlalchemy.org/en/latest/orm/mapping_api.html#sqlalchemy.orm.mapper.Mapper.attrs
la source
Pour obtenir une
as_dict
méthode sur toutes mes classes, j'ai utilisé uneMixin
classe qui utilise les techniques décrites par Ants Aasma .Et puis utilisez-le comme ça dans vos cours
De cette façon, vous pouvez appeler ce qui suit sur une instance de
MyClass
.J'espère que cela t'aides.
J'ai joué un peu plus loin avec cela, j'avais en fait besoin de rendre mes instances
dict
sous la forme d'un objet HAL avec ses liens vers des objets associés. J'ai donc ajouté cette petite magie ici, qui explorera toutes les propriétés de la classe comme ci-dessus, à la différence que je vais explorer plus en profondeur lesRelaionship
propriétés et les générerlinks
automatiquement.Veuillez noter que cela ne fonctionnera que pour les relations ayant une seule clé primaire
la source
from sqlalchemy.orm import class_mapper, ColumnProperty
en haut de votre extrait de coderenvoie un dict où les clés sont des noms d'attributs et valorise les valeurs de l'objet.
/! \ il y a un attribut supplémentaire: '_sa_instance_state' mais vous pouvez le gérer :)
la source
Je sais que c'est une vieille question, mais qu'en est-il:
Ensuite, pour obtenir les noms de colonnes:
jobStatus.columns()
Cela reviendrait
['id', 'desc']
Ensuite, vous pouvez faire une boucle et faire des choses avec les colonnes et les valeurs:
la source