Чтобы получить значение атрибута объекта, соответствующее InstrumentedAttribute
, достаточно просто получить ключ атрибута из его ColumnProperty
и извлечь его из объекта:
t.colname == getattr(t, Table.colname.property.key)
Если у вас есть Column
, это может быть немного сложнее, потому что свойство, соответствующее Column
, может иметь другой ключ. В настоящее время не существует общедоступного API для перехода от столбца к соответствующему свойству в преобразователе. Но если вам не нужно охватывать все случаи, просто загрузите attr, используя Column.key
.
Чтобы поддерживать упорядочение по убыванию, вам нужно либо создать desc()
внутри функции, либо немного покопаться в непубличных API. Класс нисходящего модификатора ClauseElement
равен sqlalchemy.sql.expression._UnaryExpression
. Чтобы увидеть, уменьшается ли он, вам нужно проверить, является ли атрибут .modifier
sqlalchemy.sql.operators.desc_op
. В этом случае вы можете получить столбец внутри него через атрибут .element
. Но, как вы видите, это закрытый класс, поэтому следите за изменениями в этой области при обновлении версий.
Проверка на снижение по-прежнему не охватывает все случаи. Полностью общая поддержка произвольных порядков должна позволять переписывать полные деревья выражений SQL, заменяя ссылки на таблицу соответствующими значениями из объекта. К сожалению, в настоящий момент это невозможно с общедоступными API. Обойти и переписать часть легко с sqlalchemy.sql.visitors.ReplacingCloningVisitor
, сложная часть - выяснить, какой столбец соответствует какому атрибуту с учетом иерархий наследования, отображений в соединениях, псевдонимах и, возможно, еще некоторых частях, которые пока что меня избегают. Я попробую реализовать этого посетителя, может быть, я смогу придумать что-нибудь достаточно надежное, чтобы быть достойным интеграции в SQLAlchemy.