В SQLAlchemy, в чем разница между синтаксисом «фильтр» и «объединение и фильтр»? - PullRequest
0 голосов
/ 29 ноября 2018

Более конкретно, я вижу, что вместо использования естественного SQL-подобного синтаксиса соединений в SQLAlchemy многие люди склонны использовать фильтры для целей объединений.Чтобы уточнить, как я должен выполнить соединение:

(session.Query(Book)
        .join(Author, Publisher, Retailer)
        .filter(
            Author.name == "Crenshaw Adams",
            Publisher.country == "United States",
            Retailer.is_online == True))

Столбцы соединения подразумеваются в отношениях, определенных в файле объявления модели.

Но везде (особенно в StackOverflow) Iвидел, как люди делают это как:

(session.Query(Book)
        .filter(
            Book.author_id == Author.id,
            Author.publisher_id == Publisher.id,
            Publisher.retailer_id == Retailer.id,
            Author.name == "Crenshaw Adams",
            Publisher.country == "United States",
            Retailer.is_online == True
            ))

Какой из этих методов является правильным способом сделать это?Какой из них больше Pythonic?Или, по крайней мере, более идиоматично в том, как предполагается использовать SQLAlchemy?И есть ли разница с точки зрения использования ресурсов БД или использования ресурсов локальной машины (то есть, нагрузка на ЦП и ОЗУ БД выше, а на локальной машине - меньше, и наоборот)?

Кроме тогопредыдущий способ не допускает использования метода update() в API запросов - он жалуется на недопустимое обновление нескольких таблиц - даже если я обновляю только одну таблицу.Последнее позволяет update() нормально работать.

1 Ответ

0 голосов
/ 03 декабря 2018

Основным отличием является то, что первое приводит к запросу, использующему синтаксис SQL-92 JOIN, в то время как последний использует более старый синтаксис - есть люди, которые предпочитают его по привычке, дляпример.И то, и другое - правильный путь, и ни один из них не имеет ничего общего с тем, является ли код Pythonic или нет.Также, на мой взгляд, ни один из них не является более идиоматическим в SQLAlchemy, хотя Query.join() прекрасно работает с определенными отношениями внешнего ключа и отношениями ORM, как вы заметили сами.Они также должны приводить к одному и тому же плану выполнения в современных СУБД SQL, поэтому нет существенной разницы в использовании ресурсов и т. Д.

Что касается Query.update(), не поддерживающих явные объединения, разные СУБД SQL имеютразличная поддержка обновлений нескольких таблиц, с разным синтаксисом и методами.Некоторые разрешают явные объединения, некоторые - нет, а некоторые разрешают обновление через подзапросы .Текущая реализация кажется компромиссной и приведёт к подходящему оператору UPDATE для используемой СУБД.

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