LINUX.ORG.RU

парсер sql на питоне

 ,


1

1

хочется странного: хочется уметь подменять запросы на лету.

пользователь пишет select * from table, а мы ему заботливо добавляем where ... limit ...

ну и понятно что select from select, всякие join и прочее тоже хочется уметь получить.

т.е. какое-то такое преобразование: string ---> ast tree ---> add expression ---> string ---> exec sql

Разве всякие ОРМ не про это? Например, Function-based query construction?

vvn_black ★★★★★
()

Специально для этого есть views. Но если имеется «скажи нет любой логике в БД» в тяжелой стадии, то только свой парсер

anonymous
()

Чем только люди не занимаются, лишь бы кодревью не делать.

anonymous
()

where ... limit ...

А потом при дебагe он сношает себе мозги на тему, почему не все записи возвращаются?

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

только свой парсер

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

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

Это чтобы вебмакаки себе всю базу в мильярд записей не вывернули.

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

Сам никогда такого не встречал. Хотя задача довольно часто в головах рождается, но вот чтобы оно работало нормально и не ломалось от того, что вместо limit написано FETCH NEXT 10 ROWS ONLY(это pg), я не видел. Больше с таким не заморачиваюсь - sql в этом плане УГ ещё то

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

смысл не пререгружать канал передачи данных?

тк база ложиться и от возврата одной записи вполне:

select count(*) from ( select * from bigone, bigone ) _
drsm ★★
()
Ответ на: комментарий от Rastafarra

лексические парсеры обычно пишут на yacc. парсер sql для yacc написан, реализация yacc для бидона вроде как тоже.

вариант кажется рабочим, но сам ничем таким не занимался

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

ты предлагаешь сделать велосипед, который точно будет даже не первой сотне велосипедов )).

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

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

я тут как?

select count(*) from ( select * from bigone b join ... ) x
where x.fld < value

т.е. оно будет ломать запросы

относительно pg думаю задача нереальная, т.к. with, lateral, unnest и другие прелести.

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

оно будет ломать запросы

where x.fld < value and ....

понятно что юзкейсы надо отрабатывать, тут попробовать бы хоть на пароке запросов.

относительно pg думаю задача нереальная

это еще очень далеко, тут просто select бы порезать.

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

Заставить джуна потрахаться и уверовать в свою неполноценность?

ну например.

так ты знаешь способ или нет? :)

Rastafarra ★★★★
() автор топика

SQLITE + https://sqlite.org/vtab.html

Если кратко, то все это работает так.

Имеется parser и run-time SQL, которая будет «дергать» функции из вашего расширения.
При желании можете обеспечить SQL запросы к ЛЮБОМУ набору данных.

Например у меня таким образом обеспечены полноценные SQL запросы к DBF + CDX /ну «нужно было»/.

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

На счет «на питоне», то пишется это все на С или C++.
Потом пишете binding и радуетесь.

anonymous
()

Из описания в треде следует что вам нужно свое подмножество SQL, и ни один чужой велосипед для этой задачи не подойдет.

ei-grad ★★★★★
()

Делается это так.
Порт, который использует СУБД берете под свой контроль.
Конечно вы должны понимать протокол, используемый СУБД.

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

пока это самое красноглазое красноглазие из всего предложенного красноглазого красноглазия в треде.

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

гугл пометил как «посещенный», но там надо пилякать :(

Rastafarra ★★★★
() автор топика

Очень странное хотение. Особенно странное, если нужно под несколько субд.

Deleted
()

Закрыть доступ к БД и поднять микросевис?

Deleted
()

пользователь пишет select * from table, а мы ему заботливо добавляем where ... limit ...

Надо избавиться от select * from table и заменить его какой-нибудь структурой, из которой будет потом сварен sql. Юзеру объяснить, что это такая фича. Парсить sql со всеми его подзапросами, диалектами, with, функциями, join'aми дело сомнительное. Кто-нибудь да сломает этот парсер.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от anonymous

Порт, который использует СУБД берете под свой контроль.

Стоите на порту, рычите и тазом двигаете?

ritsufag ★★★★★
()

Абстрагировать все SQL либо в ORM либо вообще в API. Нефиг пользователю давать в базу лезть.

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