Чего в Lazarus не хватает

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Чего в Lazarus не хватает

Сообщение Logo » 22.03.2009 23:38:21

Ask писал(а):Правильный план -- написать библиотеку для генерации SQL:

with publicip do
SQL.Select([address, regnum, dateref]).Where(regnum = myRegNum).Limit(10).Open;

Где address, regnum, dataref -- published properties объекта publicip, myRegNum -- просто переменная.

Преимущества:
1) настоящие проверки во время компиляции,
в том числе на соответствие типа параметра и типа поля, наличие выбираемых полей в указанной таблице и т.п.

Интересная идея, нужно обдумать хорошенько.
Приведенный пример представляет собой простой запрос, а как быть с вложенными запросами...
Вот реально взятый очень простой запрос из проекта с функциями объединения, как быть с функциями, переопределением типов...?:
Код: Выделить всё
     sqlToolsAddress.SQL.Text :=
'SELECT DISTINCT '
       +'textcat(textcat(textcat(textcat(textcat(textcat('
       +'address.adr_street::text, '', ''::text), address.adr_korpus::text), '
       +'''/''::text), address.adr_homenum::text), ''/''::text), address.adr_aptnum::text)::varchar(45) AS adr_address '
  +'FROM address ORDER BY adr_address;';

Можно, конечно, на уровне паскаля объединять, перебирать, преобразовывать, НО тогда теряется основное достоинство SQL - передавать по сети только то, что необходимо
2) переносимо между различными СУБД

Вот это меня смущает, скорее всего нужно будет иметь разные диалекты.
Недостатки:
1) надо писать ;)

Это не недостаток.
2) другой синтаксис, требует переобучения

Не совсем понял
3) требует перегрузки операций -- не будет работать на старых Дельфях

Старые не надо.
-------
Я уверен, если удастся найти оптимальное решение интеграции SQL в Lazarus, - рейтинг его просто взлетит. Его и так очень интенсивно используют для построения приложений управления базами данных.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Чего в Lazarus не хватает

Сообщение скалогрыз » 23.03.2009 00:37:40

Logo писал(а):Интересная идея, нужно обдумать хорошенько.
Приведенный пример представляет собой простой запрос, а как быть с вложенными запросами...
Вот реально взятый очень простой запрос из проекта с функциями объединения, как быть с функциями, переопределением типов...?:
Код: Выделить всё
     sqlToolsAddress.SQL.Text :=
'SELECT DISTINCT '
       +'textcat(textcat(textcat(textcat(textcat(textcat('
       +'address.adr_street::text, '', ''::text), address.adr_korpus::text), '
       +'''/''::text), address.adr_homenum::text), ''/''::text), address.adr_aptnum::text)::varchar(45) AS adr_address '
  +'FROM address ORDER BY adr_address;';


любое расширение синтаксиса это очень болезненная вещь. так что лучше воздержаться!
надеюсь, тут все понимают разницу между Lazarus-ом, и FreePascal-ем? и то что предлагаю "расширить с поддержкой" так это именно расширение языка FreePascal.

2 Logo. SQL знаю слабо (на уровне ВУЗа), но, глядя на твой запрос, мне как-то грустно становится :))
чтобы упростить (обезопасить?) написание подобных запросов, я бы использовал дополнительную функцию, с открытым массивом строк)
Код: Выделить всё
function SQLMultiTextCat(const Params: array of String; const ParamPostFix: String): String;
var
  i  : integer;
begin
  if length(Params)<2 then begin
    Result := '';
    Exit;
  end;
  Result := 'textcat('+ Params[0]+ParamPostFix+', '+Params[1]+ParamPostFix+')';
  for i := 2 to length(Params) - 1 do
    Result := 'textcat('+Result+', '+Params[i]+ParamPostFix+')';
end; 


а в итоге, твой код выглядел бы следующим образом:
чтобы избавится от записей вроде '","' я добавил константы, но это не обязательно. (я вообще фанат констант :))
Код: Выделить всё
     
const 
  QPeriod = '","';  //Q* означает Quoted - "в кавычегах"
  QSlash   = '"/"';   

sqlToolsAddress.SQL.Text := 'SELECT DISTINCT ' +
       SQLMultiTextCat(  ['address.adr_street',QPeriod,'address.adr_korpus',QSlash,   
          'address.adr_homenum',QSlash, 'address.adr_aptnum'], '::text')) +
       '::varchar(45) AS adr_address FROM address ORDER BY adr_address;';


ну и использовать SQLMultiTextCat в дальнейшем. Т.е. эта функция не ошибёться со скобками и запятыми, при любом количестве params (больше двух) :)
как она работает
SQLMultiTextCat( ['a','b'], '');
на выходе получаем строку вида: 'textcat(a, b)'

SQLMultiTextCat( ['a','b','c'], '');
на выходе получаем строку вида: 'textcat(textcat(a, b), c)' и т.к. далее ;) каждый новый параметр, в открытом массиве строк, добавит textcat.

у тебя в запросе везде написано ::text. Лично я понятия не имею, что это может значит и зачем :)
но всё равно предусмотрел дополнительный параметр в функции, который будет подставлять нужное тебе выражение после каждого параметра, т.е.
SQLMultiTextCat( ['a','b'], '::text') выдаст 'textcat(a::text, b::text)'
SQLMultiTextCat( ['a','b','c'], '::text') выдаст 'textcat(textcat(a::text, b::text),c::text)'

------------------------

Заметь ни в одном месте я не предлагал использовать "расширение" синтаксиса Паскаля.
Да и Вирт и Хейлсберг очень толковые ребята! И правильное использование языка Паскаль поможет (облегчит) использование других языков! :)
Что скажешь Logo? стоит ли облегчить себе задачу, написав вспомогательные функции "генерирующие" сложные SQL выражения? ;)
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Чего в Lazarus не хватает

Сообщение Logo » 23.03.2009 01:30:04

скалогрыз писал(а):
Logo писал(а):Интересная идея, нужно обдумать хорошенько.
Приведенный пример представляет собой простой запрос, а как быть с вложенными запросами...
Вот реально взятый очень простой запрос из проекта с функциями объединения, как быть с функциями, переопределением типов...?:
Код: Выделить всё
     sqlToolsAddress.SQL.Text :=
'SELECT DISTINCT '
       +'textcat(textcat(textcat(textcat(textcat(textcat('
       +'address.adr_street::text, '', ''::text), address.adr_korpus::text), '
       +'''/''::text), address.adr_homenum::text), ''/''::text), address.adr_aptnum::text)::varchar(45) AS adr_address '
  +'FROM address ORDER BY adr_address;';


любое расширение синтаксиса это очень болезненная вещь. так что лучше воздержаться!
надеюсь, тут все понимают разницу между Lazarus-ом, и FreePascal-ем? и то что предлагаю "расширить с поддержкой" так это именно расширение языка FreePascal.

2 Logo. SQL знаю слабо (на уровне ВУЗа), но, глядя на твой запрос, мне как-то грустно становится :))

Мне тоже та грустно, грустно :( :( :(
Пример, который я вставил, всего лишь СТАНДАРТНЫЙ запрос PostgreSQL, с его собственными, родными функциями, которых в родном дистрибутиве имеется всего 1798 штучек, плюс 33 триггерные функции в нагрузку дали, ну а другие уже можно самому дописать или сторонние взять, как кого научили в вузе. :D :D :D
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Чего в Lazarus не хватает

Сообщение Ask » 23.03.2009 14:55:29

Logo писал(а):Приведенный пример представляет собой простой запрос, а как быть с вложенными запросами...
Вот реально взятый очень простой запрос из проекта с функциями объединения, как быть с функциями, переопределением типов...?:

Да, определённые сложности есть, но в основном они преодолимы, например:
Код: Выделить всё
  users.SQL.Select([users.id, users.name, sessions.SQL.Select([Count()]).Where(sessions.id = users.id)])


Код: Выделить всё
  Union([users.SQL.Select([Cast(id, 'VARCHAR(200)')]), users.SQL.Select(name)])

Второй пример бессодержательный, но содержательный придумавать лень.

Logo писал(а):
Код: Выделить всё
     sqlToolsAddress.SQL.Text :=
'SELECT DISTINCT '
       +'textcat(textcat(textcat(textcat(textcat(textcat('
       +'address.adr_street::text, '', ''::text), address.adr_korpus::text), '
       +'''/''::text), address.adr_homenum::text), ''/''::text), address.adr_aptnum::text)::varchar(45) AS adr_address '
  +'FROM address ORDER BY adr_address;';


Тут Я бы для начала расстрелял либо автора СУБД, либо автора кода, а потом применил бы предложение скалогрыза со специальной функцией.

Logo писал(а):
2) переносимо между различными СУБД

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

Да нет, в 99% случаев реально обойтись общим кодом, опыт на эту тему у меня довольно большой.

2) другой синтаксис, требует переобучения

Не совсем понял

Программистам, уже знающим SQL, придётся дополнительно изучать библиотеку.

Добавлено спустя 6 минут 37 секунд:
скалогрыз писал(а):Заметь ни в одном месте я не предлагал использовать "расширение" синтаксиса Паскаля.
Да и Вирт и Хейлсберг очень толковые ребята! И правильное использование языка Паскаль поможет (облегчит) использование других языков! :)


Хейлсберг с тобой точно не согласен -- не зря же он LINQ придумал и активно продвигает.
Ask
постоялец
 
Сообщения: 163
Зарегистрирован: 25.12.2008 03:51:37

Re: Чего в Lazarus не хватает

Сообщение Logo » 23.03.2009 15:25:46

Ask писал(а):Тут Я бы для начала расстрелял либо автора СУБД, либо автора кода, а потом применил бы предложение скалогрыза со специальной функцией.

Это называется "Прогрессивные методы информационных технологий"
Да нет, в 99% случаев реально обойтись общим кодом, опыт на эту тему у меня довольно большой.

Никогда в жизни не променяю мощь PostgreSQL на совместимость с MsSQL.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 45

Рейтинг@Mail.ru