LINUX.ORG.RU

Немного о том где и как хранить SQL запросы:

 


0

2

В SQL файлах:


/*#secondTestQuery*/ --название запроса
select 
 now(), /*@date title=Дата, javaType=java.util.Date*/ -- тут определяется тип и аттрибуты поля
 17843,  --@weight title=Вес, javaType=float
--тут определеяется параметр запроса id с типом INT, строка `123` для использования в SQL редакторе, т.е. только для тестирования и отладки
        /*$id, type=INT {*/123/*}*/
 ;
/*#secondTestQuery end*/

/*#getAlarmButtonEvents */
select t.*, 
       (select tc.comment from telemetrycomments tc where tc.id = t.uid) as comment
  from telemetry t
 where t.eventtime >= /*$startDate, type=timestamp {*/to_timestamp('20121206000000','YYYYMMDDHH24MISS')/*}*/
   and t.eventtime <= /*$endDate, type=timestamp {*/to_timestamp('20121206235959','YYYYMMDDHH24MISS')/*}*/
   and (t.provider || ':' || t.deviceid) = any (/*$devices {*/'{"test:test"}'/*}*/::varchar[])
   and t.eventtype = 'ALARM_BUTTON'
/*#getAlarmButtonEvents end*/
/*   После парсинга шаблоны запросов будут преобразованы в код пригодный для выполнения:   */
-- secondTestQuery
select 
 now(),
 17843,
 ?
 ;
-- getAlarmButtonEvents 
select t.*, 
       (select tc.comment from telemetrycomments tc where tc.id = t.uid) as comment
  from telemetry t
 where t.eventtime >= ?
   and t.eventtime <= ?
   and (t.provider || ':' || t.deviceid) = any (?::varchar[])
   and t.eventtype = 'ALARM_BUTTON'
в принципе все и так понятно, но желающие могут залезть за подробностями (реализацию не публикую): http://wayerr.livejournal.com/30195.html

К слову история вопроса давняя: java ... и sql лапша в коде но то решение ныне уже закопано

Deleted

Последнее исправление: Deleted (всего исправлений: 1)

в хранимках, а их вызывать просто как ф-ии. Это, конечно, зависит от условий, но часто вполне допустимо.

mashina ★★★★★
()
Ответ на: комментарий от mashina

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

Deleted
()

Ух-ты, ты изобрёл ORM!

i-rinat ★★★★★
()
Ответ на: комментарий от Dantix

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

Deleted
()
Ответ на: комментарий от Deleted

это тоже проходили, это один из самых неправильных путей

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

mashina ★★★★★
()
Ответ на: комментарий от mashina

твой вариант из портянок, зашитых в приложение

твой вариант из портянок, зашитых в процедуры...

Нетрудно догадаться что портянки уместны только в сапогах, а исходный код в приложении.

Понятно, что некоторым хочется побыть царьками и усложнить развертывание и сопровождение, потому им ничего позволять и нельзя.

Deleted
()

Хм, а почему так ужасно, если запросы хранятся изолировано в каком-нибудь классе в ввиде статических(опционально) полей? Пока видел только так и особых проблем не наблюдал.
Как понял из топиков, пробелмы при переезде?

anonymous
()
Ответ на: комментарий от anonymous

Те. перелопать dao-реализацию и готово.

anonymous
()

А чем плохо его в коде хранить?

У нас портянки есть по сотни строк... И ничего, живем. Правда сама эта партянка тоже на лету от кучи парамтеров собирается.

namezys ★★★★
()

CREATE VIEW

/thread

anonymous
()

А почему бы не сохранить сложные запросы в виде представлений в БД и не строить запросы на их базе. Размер «портянок» сократиться.

looper
()
Ответ на: комментарий от Deleted

А чем приведенный пример отличается от описания хранимки, только во внешнем файле ?

Есть название, описаны параметры, составлен текст.

Добавление нового параметра без правки кода использующего secondTestQuery - фейл

Добавление какой либо доп обработки в secondTestQuery, например хранимки могут использовать два или три запроса в зависимости от условий, - фейл

Изменение sql без тестирование совместно с кодом его вызывающим - фейл

В общем, действительно очень похоже на ORM, но там хоть задача оторваться от конкретного SQL диалекта и входные параметры относительно жестко зафиксированы. А тут задача какая ? Доказать что sql правильно хранить отдельно от кода ?

TEX ★★★
()
Ответ на: комментарий от Deleted

Понятно, что некоторым хочется побыть царьками и усложнить развертывание и сопровождение, потому им ничего позволять и нельзя.

Приложение само может развернуть необходимые ему ХП.

Я запросы либо храню в конфигах (обычно шаблоны запросов), либо генерирую чем-нибудь вроде ORM. Если нужно настрого запретить клиенту видеть запросы к БД, то только ХП, причем сервер БД разворачивать отдельно.

staseg ★★★★★
()

Почитал ссылки. Думаю стоило бы добавить что речь идет «кроссплатформенном» java коде, для решения задачи замены sql бэкенда.

Ну да.. ORM как он есть.

TEX ★★★
()

в хранимках, расположенных по отдельным директориям и файлам.

P.S. за SQL код в исходном коде приложения готовь убивать и насиловать труп - приходилось поддерживать крупную корпоративную систему с 15-летней историей разработки :(

necromant ★★
()
Ответ на: комментарий от necromant

в хранимках, расположенных по отдельным директориям и файлам.

в жж я описал все недостатки хранимок, еслиб тебе пришлось поковырять больше десятка серверов с хранимками, где хранимки _могут_ отличаться (т.к. каждый затачивал чуток под себя), то тыб был бы готов убивать и за них 8)

Deleted
()
Ответ на: комментарий от TEX

тыб прочитал что такое ORM, ей богу.

Deleted
()
Ответ на: комментарий от staseg

Приложение само может развернуть необходимые ему ХП.

Два инстанса на одной субд, ой, да?

Я запросы либо храню в конфигах (обычно шаблоны запросов), либо генерирую чем-нибудь вроде ORM.

у меня также, формат «конфигов» ты видишь выше. Также там есть еще макросы, которые могут разворачиваться в подзапросы, но то изврат.

Deleted
()
Ответ на: комментарий от Deleted

в жж я описал все недостатки хранимок

Половина перечисленных недостатков - в приведенном решении никуда не делись. От отдаления запроса от кода - ибо откуда ты знаешь с какими значениями вызывает процедуру код ? До сигнатуры - менять сигнатуру в отдельном файле без смены вызова в коде - фейл

TEX ★★★
()
Ответ на: комментарий от Deleted

Два инстанса на одной субд, ой, да?

БД не поддерживает понятие «рабочих областей» с раздельными ХП ? В баню такую БД

TEX ★★★
()
Ответ на: комментарий от TEX

От отдаления запроса от кода - ибо откуда ты знаешь с какими значениями вызывает процедуру код ?

вот для процедуры это действительно узнать не выйдет, хуже того не выйдет узнать использует ли ее кто-то вообще 8)

менять сигнатуру в отдельном файле без смены вызова в коде - фейл

так не меняй, тут у разработчика и файл запроса и клиентского кода в области ответственности, а процедура она в базе, и чья она кому нужна, и кто правил - хз (IRL хз)

Deleted
()
Ответ на: комментарий от TEX

бд выбираем по желанию левой пятки любителей процедур? не много ли чести оным?

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.