Добавить к @ Tendrid ответ .Я провел небольшое расследование, используя тихий наивный подход.filter
метод имеет *criterion
в качестве аргумента, некоторые другие методы ORM Query имеют аналогичный аргумент.
В случае filter
метод *criterion
аргумент заканчивается передачей в _literal_as_text который в случае строки - помечает его как безопасный sql (пожалуйста, исправьте меня, если я ошибаюсь).Поэтому это делает его небезопасным.
Вот результат исследования класса ORM исследования метода с аргументом *criterion
:
filter - uses _literal_as_text (NOT SAFE)
having - uses _literal_as_text (NOT SAFE)
distinct - uses _literal_as_label_reference (NOT SAFE)
group_by - uses _literal_as_label_reference (NOT SAFE)
order_by - uses _literal_as_label_reference (NOT SAFE)
join - uses model attributes to resolve relation (SAFE)
Примерывозможные пропуски методов (для простоты пропускается форматирование строки):
db.session.query(User.login).group_by('login').having('count(id) > 4; select name from roles').all()
db.session.query(User.login).distinct('name) name from roles /*').order_by('*/').all()
db.session.query(User.login).order_by('users_login; select name from roles').all()
db.session.query(User.login).group_by('login union select name from roles').all()
Обратите внимание , что эти методы небезопасны только при передаче строкового литерала.