Я пишу маленький контейнер sqlalchemy для экспорта данных из базы данных MySQL с некоторыми легкими преобразованиями данных — главным образом меняющий имена полей. Мой текущий сценарий хорошо работает, но требует, чтобы я по существу описал свою модель дважды — однажды в объявлении класса и однажды как список имен полей для итерации.
Я пытаюсь выяснить, как использовать самоанализ для идентификации свойств на объектах строки, которые являются средствами доступа столбца. Следующие работы почти отлично:
for attr, value in self.__class__.__dict__.iteritems():
if isinstance(value, sqlalchemy.orm.attributes.InstrumentedAttribute):
self.__class__._columns.append(attr)
за исключением того, что мой к - много средств доступа отношения является также экземплярами sqlalchemy.orm.attributes. InstrumentedAttribute, и я должен пропустить их. Там какой-либо путь состоит в том, чтобы различать два, в то время как я осматриваю словарь класса?
Большая часть документации, которую я нахожу на sqlalchemy самоанализе, включает рассмотрение metadata.table, но так как я переименовываю столбцы, те данные не являются тривиально отображаемыми.
Я бы все еще хотел увидеть ответ на этот вопрос, но я обошел его, изменяя имена аксессоров отношений (например, '_otherentity' вместо 'otherentity') и затем фильтруя по имени. Для моих целей работает отлично.
Сопоставитель каждого сопоставленного объекта имеет атрибут столбцы
со всеми определениями столбцов. Например, если у вас есть декларативный класс User
, вы можете получить доступ к сопоставителю с помощью User .__ mapper __
и столбцов с:
list(User.__mapper__.columns)
Каждый столбец имеет несколько атрибутов, включая имя
(который может не совпадать с сопоставленным атрибутом с именем key
), обнуляемым
, уникальным
и так далее ...