Я пытался выяснить, как выполнить итерации по списку столбцов, определенных в модели SQLAlchemy. Я хочу это для записи некоторой сериализации и копирую методы в несколько моделей. Я не могу просто выполнить итерации по obj.__dict__
так как это содержит много SA определенные объекты.
Любой знает о способе просто добраться id
и desc
имена от следующего?
class JobStatus(Base):
__tablename__ = 'jobstatus'
id = Column(Integer, primary_key=True)
desc = Column(Unicode(20))
В этом маленьком случае я мог легко создать a:
def logme(self):
return {'id': self.id, 'desc': self.desc}
но я предпочел бы что-то, что автоматически генерирует dict
(для больших объектов).
Вы можете использовать следующую функцию:
def __unicode__(self):
return "[%s(%s)]" % (self.__class__.__name__, ', '.join('%s=%s' % (k, self.__dict__[k]) for k in sorted(self.__dict__) if '_sa_' != k[:4]))
Она исключит атрибуты SA magic , но не исключит отношения. Таким образом, в основном он может загружать зависимости, родителей, детей и т. Д., Что определенно нежелательно.
Но на самом деле это намного проще, потому что если вы наследуете от Base
, у вас есть атрибут __ table __
, так что вы можете:
for c in JobStatus.__table__.columns:
print c
for c in JobStatus.__table__.foreign_keys:
print c
См. Как обнаружить свойства таблицы из сопоставленного объекта SQLAlchemy - аналогичный вопрос.
Правка Майка: См. Такие функции, как Mapper.c и Mapper.mapped_table . Если используется версия 0.8 и выше, см. Также Mapper.attrs и связанные функции.
Пример для Mapper.attrs :
from sqlalchemy import inspect
mapper = inspect(JobStatus)
for column in mapper.attrs:
print column.key
Вы можете получить список определенных свойств из сопоставителя. В вашем случае вас интересуют только объекты ColumnProperty.
from sqlalchemy.orm import class_mapper
import sqlalchemy
def attribute_names(cls):
return [prop.key for prop in class_mapper(cls).iterate_properties
if isinstance(prop, sqlalchemy.orm.ColumnProperty)]