Когда использовать ORM (Продолжение, Datamapper, Арканзас, и т.д.) по сравнению с чистым SQL для запросов

Мой коллега в настоящее время разрабатывает SQL-запросы как тот ниже для представления отчетов, которые отображены в файлах Excel через внешний запрос данных. В настоящее время только процессы создания отчетов на DB требуются (никакие операции CRUD).

Я пытаюсь убедить его, что было бы лучше использовать рубиновый ORM, чтобы смочь отобразить данные в rails/sinatra приложении.

Несмотря на очевидные преимущества в отображении данных, что преимущества там для него в обучении использовать ORM как Sequel или Datamapper?

SQL-запросы, которые он пишет, ясно довольно сложны, и быть относительно в новинку для SQL, он часто жалуется, что это является очень трудоемким и сбивает с толку. Действительно ли возможно записать чрезвычайно сложные запросы с ORM? и если так, который наиболее подходит (я услышал, что Продолжение хорошо для наследия dbs)? и что преимущества изучения являются рубиновыми и используют ORM по сравнению с тем, чтобы придерживаться плоскости SQL в создании сложных запросов базы данных?

21
задан Daniel Lang 11 September 2013 в 23:19
поделиться

6 ответов

Я сопровождающий DataMapper, и я считаю, что для создания сложных отчетов следует использовать SQL.

Хотя я думаю, что когда-нибудь у нас будет DSL, который обеспечит мощь и лаконичность SQL, все, что я видел до сих пор, требует от вас написания кода на Рубине больше, чем на SQL для сложных запросов. Я бы лучше поддерживал 5-строчный SQL-запрос, чем 10-15 строк Ruby-кода, чтобы описать ту же самую сложную операцию.

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

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

class User
  include DataMapper::Resource

  property :id,   Serial
  property :name, String,  :length => 1..100, :required => true
  property :age,  Integer, :min => 1, :max => 130

  def self.some_complex_query
    repository.adapter.select <<-SQL
      SELECT ...
        FROM ...
       WHERE ...
       ... more complex stuff here ...
    SQL
  end
end

Тогда я могу просто сгенерировать отчет, используя User.some_complex_query. Также можно подтолкнуть SQL-запрос к просмотру, если вы хотите дополнительно очистить этот код.

EDIT: Под "видом" в вышеприведенном предложении я имел в виду вид СУБД, а не вид в контексте MVC. Просто хотел прояснить любую потенциальную путаницу.

28
ответ дан 29 November 2019 в 20:12
поделиться

Да, следует использовать систему управления версиями, независимую от GAE, даже при управлении версиями развертывания.

Я использовал репозитории Unfuddle и Git, и это было очень полезно, включая некоторые простые функции управления проектами. Он включает бесплатный частный план. Выполните возврат всего кода в Git, а затем выполните развертывание в GAE.

-121--3866343-

Понимая, что мой первый ответ был довольно странным в своей математике, я создал новую идею. Я полагаю, что алгоритм здесь похож на алгоритм нескольких других ответов, но эта реализация, кажется, соответствует «симпатичному» (если это равно простому) требованию вопроса:

def func(id):
    rnd = random()
    sum = 0
    for row in d:
        if row[0] == id:
            sum = sum + row[2]
            if rnd < sum:
                return row[1]

В примере данных из ОП это происходит следующим образом:

  • Выберите случайное число от 0 до 1,0
  • Если число равно < 0,2 возвращает первый элемент
  • Иначе если число равно < 0,5 возвращает второй элемент
  • else (если число < 1,0 ) возвращает третий элемент
-121--1858945-

ORM обозначает объектно-реляционное отображение - но, глядя на запрос, ваш друг, похоже, хочет получить довольно конкретную таблицу сумм и других предметов... Я не использовал Ruby's Sequel, но я использовал Hibernate, и SQLAlchemy Python (для Django/Turbogears), и хотя вы можете делать такие запросы, я не верю, что это их сила.

Сила ORM исходит из возможности найти отношения объектов Foo- > Bar, скажем, вы хотите, чтобы все объекты Bar для поля Foo были больше, чем X... Такого рода вещи. Поэтому я бы не стал классифицировать ORM как «хорошее» решение, хотя переходя на реальный язык программирования, как Ruby и делая SQL через него вместо Excel... это само по себе победа.

Только мои 2 цента.

4
ответ дан 29 November 2019 в 20:12
поделиться

Нет, кроме того, что проще включать одиночные цитаты в последовательности с двойными кавычками и наоборот.

-121--3450574-

Запрос последовательности версии уже установленного дистрибутива

Для извлечения версии из пакета во время выполнения (что на самом деле задает ваш вопрос) можно использовать:

import pkg_resources  # part of setuptools
version = pkg_resources.require("MyProject")[0].version

Сохранить последовательность версии для использования во время установки

Если вы хотите перейти к раунду другого пути (который, похоже, был тем, о чем другие авторы ответа здесь думали, что вы просили), поместите последовательность версии в отдельный файл и прочитайте содержимое этого файла в setup.py .

Вы могли заставить version.py в своем пакете с __ версия __ линия, затем прочитать его от setup.py использование execfile ('mypackage/version.py') , так, чтобы это установило __ версия __ в setup.py пространстве имен.

Если требуется гораздо более простой способ работы со всеми версиями Python и даже с языками, отличными от Python, которые могут нуждаться в доступе к версии последовательности:

Сохраните версию последовательности как единственное содержимое обычного текстового файла, например VERSION , и прочитайте этот файл во время setup.py .

version_file = open(os.path.join(mypackage_root_dir, 'VERSION'))
version = version_file.read().strip()

Тот же самый файл VERSION будет работать точно так же в любой другой программе, даже не Python, и вам нужно будет изменить последовательность версии только в одном месте для всех программ.

Предупреждение о состоянии гонки во время установки

Кстати, НЕ импортируйте пакет из setup.py, как предложено в другом ответе: это будет работать для вас (потому что у вас уже установлены зависимости вашего пакета), но это вызовет хаос у новых пользователей вашего пакета, так как они не смогут установить ваш пакет без установки зависимостей вручную.

-121--3470703-

Если вы пишете свои запросы вручную, у вас есть возможность оптимизировать их. Когда я смотрю на этот запрос, я вижу некоторые возможности для оптимизации (E.ICGROUPNAME LIKE '% san-fransisco%' или E.ICGROUPNAME LIKE '% bordeaux%' не будут использовать индекс = сканирование таблицы).

При использовании сопоставителя OR (собственных объектов/таблиц) для создания отчетов вы не имеете или немного контролируете результирующий SQL-запрос.

Но: Вы можете поместить этот запрос в представление или хранимую процедуру и сопоставить это представление/Proc с сопоставителем OR. Можно оптимизировать запросы и можно использовать все функции Приложения Рамки.

6
ответ дан 29 November 2019 в 20:12
поделиться

Если вы не имеете дело с объектами, ORM не нужен. Похоже, что ваш друг просто нужно генерировать отчеты, в этом случае чистый SQL просто отлично до тех пор, пока он знает, что он делает (например, избегая проблем впрыска SQL).

ORM означает «объектно-реляционное отображение». Если у вас нет «O» (объектов), то это, вероятно, не хорошо подходит для вашего приложения. Там, где ORMS действительно сияет, находится в сохраняющихся объектах в базу данных и загружает их из базы данных.

5
ответ дан 29 November 2019 в 20:12
поделиться

В такой ситуации, я бы, вероятно, написал их вручную или использую вид (если БД вы используете Views Views)

3
ответ дан 29 November 2019 в 20:12
поделиться

Орм используются, когда у вас есть объекты (бизнес-объекты). Поэтому я предполагаю, что у вас есть приложение, с которого вы создаете и управляете бизнесобщими объектами, которые в конечном итоге сохраняются в базе данных. Если у вас есть, вы почти определенно получили некоторое представление отношений и, вероятно, многие из расчетов, которые вы собираетесь использовать в отчетах. Проблема с использованием SQL для непосредственного доступа к вашей базе данных для отчетов является просто ремонтопригодность. Вы обычно прилагаете много усилий для обеспечения того, чтобы ваши бизнес-объекты скрывали какие-либо детали их базы данных. Вы реализуете бизнес-правила и делаете общие расчеты в ваших бизнес-объектах. Создайте общий язык для всех членов команды и т. Д. Вы тогда используете ORM для отображения в базе данных и использовать Habanero или Nhibernate или что-то в этом роде. Это все здорово. Мы делаем это все во имя ремонтопригодности и отлично. Вы можете перенести свое приложение Изменить свой дизайн и т. Д.

Теперь вы идете и пишу SQL, чтобы запустить отчеты с течением времени, у вас есть сотни отчетов. Во-первых, они часто дублируют логику, у вас уже есть в ваших бизнесобекциях (обычно без каких-либо тестов) и даже хуже Бхам Дамб извините, вернуемость теперь фарширована забыть о перемещении этого поля из одной таблицы к другому, забудьте о разделении этой таблицы в два изменения есть ряд докладов, которые будут неожиданно сломаться.

Проблема с вашим доменными объектами / бизнесобщими объектами является просто одной из производительности.

Таким образом, если вы используете доменную конструкцию или концепции бизнес-объектов, пытаются использовать их для отчетов. (Вы, вероятно, будете бегать непосредственно из DB, используя SQL или сохраненные Procs для причин производительности, но попробуйте сначала ограничить их использовать свои бизнес-объекты, а затем использовать SQL). Другой вариант, конечно, использует отдельную базу данных отчетности (например, некоторые концепции BI)Поэтому отображение от вашей транзакционной БД до вашей отчетности DB, следовательно, в одном месте и легко изменяется в тех случаях, когда вы хотите изменить свой дизайн.

Объекты домена (Business Objects) и ORM имеют все знания, чтобы позволить вам начать строительство высоких выполняющих запросов, которые работают непосредственно в базе данных при использовании терминологии домена. Позволяет надеяться, что они продолжают развиваться до такой степени, что это реальность.

До тех пор, если вы используете бизнес объекты в своем приложении, попробуйте использовать их для отчетности, когда производительность - это проблема, прибегающая к SQL.

1
ответ дан 29 November 2019 в 20:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: