Как получить значение свойства, соответствующего атрибуту SQLAlchemy InstrumentedAttribute? - PullRequest
4 голосов
/ 10 ноября 2009

Учитывая SQLAlchemy сопоставленный класс Table и экземпляр этого класса t, как мне получить значение t.colname, соответствующее sqlalchemy.org.attributes.InstrumentedAttribute экземпляру Table.colname?

Что если мне нужно задать тот же вопрос с Column вместо InstrumentedAttribute?

Учитывая список столбцов в предложении ORDER BY и строку, я хотел бы найти первые n строк, которые идут до или после этой строки в указанном порядке.

1 Ответ

6 голосов
/ 11 ноября 2009

Чтобы получить значение атрибута объекта, соответствующее 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...