Строка принимает объекты Column в качестве индексов:
row[MyClass.some_element.__clause_element__()]
, но это приведет вас только к классам и конструкциям aliased (), к которым у вас есть доступ извне.Весьма вероятно, что это будет все, что вам нужно для этой части проблемы (даже если в конечном счете идея не сработает, читайте дальше).
Если в вашем утверждении были обернуты подзапросы, от использованиятакие вещи, как from_self () или join () для полиморфной цели, метод create_instance () не дает вам доступа к функциям перевода, которые вам понадобятся для этого.
Если вы пытаетесь добраться до строк, которые связаны с eagerload (), это совсем не то, что вы должны делать.eagerload () - это оптимизация загрузки коллекций.Если вы хотите, чтобы ваш запрос объединился между двумя таблицами, и вы хотите фильтровать объединенную таблицу, используйте join ().
Но, прежде всего, create_instance () относится к версии 0.1 SQLAlchemy, и я сомневаюсь, что кто-либо сомневается в этом.использует его для чего угодно, и у него нет возможности сказать «пропустить этот ряд».Он должен что-то вернуть, иначе маппер создаст экземпляр самостоятельно.Поэтому, независимо от того, насколько хорошо вы можете интерпретировать строку, здесь нет никакой ловушки для того, что вы хотите сделать.
Если бы я действительно хотел сделать такую вещь, вероятно, было бы проще получить «обезьяну-патч» fetchall ()"метод возвращаемого ResultProxy для фильтрации строк и отправки его в Query.instances ().Любой результат может быть отправлен в этот метод.Хотя, если Query выполнил переводы и тому подобное для сопоставленных элементов selectable, ему также понадобился бы оригинальный QueryContext, чтобы знать, как переводить.Но я бы не стал беспокоиться об этом.
В целом, если скорость настолько критична к проблеме во всем этом, что создание объекта так важно, я бы сделал так, чтобыМне не нужны сопоставленные объекты для всей операции, или я бы использовал кэширование или генерировал нужные мне объекты вручную из набора результатов.Я также хотел бы убедиться, что у меня есть доступ ко всем целевым столбцам в выбираемой мной выборке, чтобы я мог повторно извлечь из строк результатов, что означает, что я либо не использую функции автоматической генерации подзапроса / псевдонима в ORM,или я использую язык выражений напрямую (если вы действительно жаждете скорости и хотите писать большие участки оптимизирующего кода, вам, вероятно, следует просто использовать язык выражений).
Итак, реальные вопросыВы должны спросить здесь:
- Вы убедились, что реальная разница в скорости - это создание объекта из ряда.Т.е. не выборка строки или выборка ее столбцов и т. Д.
- Есть ли в строке только некоторые дорогие столбцы, которые вам не нужны?Вы изучили deferred ()?
- Что это за бизнес-правила и почему они не могут быть выполнены в SQL, как хранимые процедуры и т. Д.
- Сколько тысяч строк вы действительно пропускаете здесь?что он настолько «медленный», что не «пропускает» их
- Исследовали ли вы методы присутствия объектов, такие как кэши в памяти, предварительные загрузки и т. д. Для многих сценариев это соответствует требованиям.
- Ничего из этого не работает, и вы действительно хотите взломать некоторый домашний код оптимизации.Так почему бы не использовать язык выражений SQL напрямую?Если в конечном итоге вы имеете дело только со слоем представления, строки результатов являются довольно дружественными (они допускают доступ в стиле «атрибут» и т. Д.) Или строят некоторую быструю процедуру «создания объекта» из него.ORM представляет собой очень специфический вариант использования языка выражений SQL, и если вам действительно нужно что-то гораздо более легкое, чем его, вам лучше его пропустить.