Как вы смешиваете сырой SQL с API ORM, когда используете django.db? - PullRequest
2 голосов
/ 08 августа 2010

Инструменты ORM хороши, когда нам нужны простые запросы select или insert.

Но иногда нам может потребоваться использовать необработанные запросы SQL, потому что нам может потребоваться выполнять запросынастолько сложный, что простое использование ORM API не может дать нам эффективного и действенного решения.

Что вы делаете, чтобы справиться с разницей между объектами, возвращаемыми из необработанных запросов и ormзапросы

Ответы [ 2 ]

2 голосов
/ 08 августа 2010

Я лично стараюсь проектировать свои модели, чтобы мне не пришлось писать необработанные SQL-запросы или отступать от микширования в ContentTypes инфраструктуре для сложных отношений, поэтому у меня нет опыта втема.

Документация охватывает тему API для выполнения необработанных запросов SQL .Вы можете использовать Manager.raw() в своих моделях (MyModel.objects.raw()) для запросов, в которых вы можете сопоставить столбцы с фактическими полями модели, или пользователь cursor для запроса необработанных строк в подключении к базе данных.

Если вы собираетесь использовать Manager.raw(), вы будете работать с RawQuerySet вместо обычного QuerySet.Несмотря на все это, при работе с объектами результата оба контейнера одинаково эмулируют контейнеры, но QuerySet - это более насыщенная функциональность монада.

Я могу себе представить, что выполнение необработанных запросов SQL в Django было бы более полезным, чемработа с платформой без поддержки ORM - Django может управлять схемой вашей базы данных и предоставлять вам соединение с базой данных, и вам нужно будет только вручную создавать запросы и позиционировать аргументы запроса.Полученные строки могут быть доступны как списки или словари, оба из которых делают его подходящим для отображения в шаблонах или выполнения дополнительного подъема.

1 голос
/ 08 августа 2010

SQLAlchemy позволяет немного усложнить формулировку запросов , поэтому вы обычно можете обойтись без необработанного sql.Если вам нужно углубиться в raw sql, вы можете использовать connection.execute.Но есть помощники, такие как text и select функции , чтобы упростить это при программировании.Что касается работы с возвращенными объектами, вы получаете список кортежей, с которыми легко иметь дело с помощью питона.

В общем, если вам нужно обработать строки (список кортежей и т. Д.) Как то, что возвращает ваш ORM, одним из подходов было бы написать класс адаптера, который имитирует интерфейс набора запросов.Это можно инициализировать с помощью «схемы» возвращаемых кортежей, а затем выполнять итерацию и возвращать объекты со свойствами вместо кортежей.Мне это на самом деле не нужно, но я вижу, как это может быть полезно, если, например, у вас есть инфраструктура, которая опирается на передаваемые наборы запросов.

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