Уведомления

Группа в Telegram: @pythonsu

#1 Май 27, 2009 06:58:51

baloo
От:
Зарегистрирован: 2008-05-13
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy оператор LIKE: String Overflow - вот это сюрприз!!!

Используем для поиска в таблице конструкцию LIKE при помощи SQLAlchemy:

        contracts = contracts_q.filter(and_(Contracts.nunitcode =='0', Contracts.ncont.like('%'+ncont+'%'), 
Contracts.contract.like('%'+contract+'%')))
Размер поля NCONT в базе данных (FireBird, впрочем, разницы нет) = 4 символа.
так вот, если в форму поиска в поле ncont вводим 1, или 10 - то все нормально, ищет.
А если 100 - кричит про String Overflow. Дескать, там 5 символов ('%100%') , а поле - всего 4.
Причем делает это SQLAlchemy. Прослойка - драйвер kinterbasdb этого не делает, пробовал в интерактивном режиме, пропускает по LIKE и 1, и 10, и 100, и 9999999999. Естественно, в крайнем случае ничего не находит, но не выпадает с исключением.
Зашибенно вообще… Неужели никто не сталкивался?



Офлайн

#2 Май 27, 2009 08:26:27

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

SQLAlchemy оператор LIKE: String Overflow - вот это сюрприз!!!

Похоже на баг. Регулярка воспринимается как значение поля.



Офлайн

#3 Май 27, 2009 09:02:14

baloo
От:
Зарегистрирован: 2008-05-13
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy оператор LIKE: String Overflow - вот это сюрприз!!!

Надо им как-то сказать. Открыть им глаза ))) Неужели никто еще в эту ловушку не попадал.. И в Google ничего на эту тему нет…
Ну… можно конечно устроить пляс с бубном - обработку размера %параметр%, но это уже слишком.

А вообще насколько большое значение имеет SQLAlchemy? Это я к тому, что сейчас пытаюсь использовать сразу напрямую kinterbasdb. Не вылезет ли в дальнейшем что-нибудь вроде того, что аутентификация захочет, чтобы я SA использовал или еще где чего?



Офлайн

#4 Май 27, 2009 14:05:56

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

SQLAlchemy оператор LIKE: String Overflow - вот это сюрприз!!!

Ну если нужен ОРМ - используй SQLAlchemy :) Насколько я помню, ты предпочитаешь работать с базой напрямую через самописные запросы. Насколько я знаю, kinterbasdb API2 совместимо, поэтому и аутентификацию можно делать непосредственно через него.
Да сама структура: DB - DB API (kinterbasdb) - ORM (SQLAlchemy) - Python module вполе позволяет исключить ORM-звено.



Офлайн

#5 Июнь 3, 2009 11:25:53

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy оператор LIKE: String Overflow - вот это сюрприз!!!

1) Есть возможность посмотреть какой запрос генерит твой ОРМ?
2) Когда-то я стыкался с таким глюком и это был глюк ФБ - там была проблема с кодировкой. Решилось редактированием строки.



Офлайн

#6 Июнь 6, 2009 11:44:45

baloo
От:
Зарегистрирован: 2008-05-13
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy оператор LIKE: String Overflow - вот это сюрприз!!!

Вот сообщение, там и сгенеренный запрос:

ProgrammingError: (ProgrammingError) (-802L, "String overflow: value 6 bytes long cannot fit in character field of maximum length 4 (value is '%1111%').") 'SELECT count(1) AS count_1 \nFROM "CONTRACTS" \nWHERE "CONTRACTS".nunitcode = ? AND "CONTRACTS".ncont LIKE ? AND "CONTRACTS".contract LIKE ?' ['0', u'%1111%', u'%%']
А вот ссылка на мой трэйсбэк отправленный
http://pylonshq.com/tracebacks/7ece2e82675ea737f24e0aade09fbd6a
База в кодировке win1251, FB 2.1, си$темные в ней, понятно, на Unicode_FSS, но думается, это не мешает…



Офлайн

#7 Окт. 27, 2009 18:35:38

ods
От:
Зарегистрирован: 2007-03-03
Сообщения: 47
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy оператор LIKE: String Overflow - вот это сюрприз!!!

baloo
А вот ссылка на мой трэйсбэк отправленный
http://pylonshq.com/tracebacks/7ece2e82675ea737f24e0aade09fbd6a
Как видно из traceback'а, SQLAlchemy тут не виноват: он всего лишь отдаёт ошибку от DB API модуля (метод _handle_dbapi_exception). SQLAlchemy позволяет выводить в лог запросы (echo=True или настройкой logging), которые он посылает в базу. Именно эти запросы и именно в том же виде (параметры отдельно от запроса) необходимо пробовать воспроизвести с kinterbasdb. Рискну утверждать, что ошибка выдаётся именно kinterbasdb в фунции _PyObject2XSQLVAR_check_range_SQL_CHARACTER, так что жаловаться на проблему стоит разработчикам kinterbasdb.



Офлайн

#8 Ноя. 23, 2009 10:23:24

baloo
От:
Зарегистрирован: 2008-05-13
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy оператор LIKE: String Overflow - вот это сюрприз!!!

Пожаловался разработчику. Вот ответ от Pavel Cisar:

There is a difference in SQLAlchemy code and your test code. Beside that
SQLAlchemy uses parametrised statement (with ?) while your code does
not, more importantly SQLAlchemy statement uses UNICODE string for
parameter value while your test code does not (it uses UTF-8 thought).

KInterbasDB should handle automatic UNICODE/charset conversion for you,
but it has to be properly set. The key here is the CONNECTION charset
(database charset is about storage encoding, connection charset is about
how you'll pass / get values to / from your application. KInterbasDB has
also several modes for automatic translations controlled by
kinterbasdb.init(type_conv=<value>) call. See KInterabsDB documentation
for details.

Ну я, конечно, had saw всю эту документацию, там есть опции автоматической конвертации в KInterbasdb. Попробовал менять их, отключать - никакой разницы. Вообще я бы отказался от SQLAlchemy, поскольку предпочитаю работать с обычными запросами. Единственное, что мне нравится - так это как SQLAlchemy взаимодействует с Paginator'ом. Ведь для того, чтобы паджинатор посчитал страницы и пр., по-любому требуется запросить весь запрос. Проще говоря, прменение rows так или иначе запрашивает ВСЕ, а потом из него берет свое. Получается долго. А алхимия делает как-то быстро и элегантно, даже запрос в 60 тысяч срок делит за секунду. Пытался отследить как, но пока ума не хватило.



Офлайн

#9 Ноя. 23, 2009 10:25:50

baloo
От:
Зарегистрирован: 2008-05-13
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy оператор LIKE: String Overflow - вот это сюрприз!!!

Кстати, склепал на скорую руку аналог моей FireBird-овской таблицы на SQLite, работает!!! То-есть, слабое звено… я бы не сказал, что все-таки в KinterbasDB, а как бы во взаимодействии его и алхимии :(



Офлайн

#10 Ноя. 23, 2009 10:30:23

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

SQLAlchemy оператор LIKE: String Overflow - вот это сюрприз!!!

baloo
Вообще я бы отказался от SQLAlchemy, поскольку предпочитаю работать с обычными запросами. Единственное, что мне нравится - так это как SQLAlchemy взаимодействует с Paginator'ом. Ведь для того, чтобы паджинатор посчитал страницы и пр., по-любому требуется запросить весь запрос. Проще говоря, прменение rows так или иначе запрашивает ВСЕ, а потом из него берет свое. Получается долго. А алхимия делает как-то быстро и элегантно, даже запрос в 60 тысяч срок делит за секунду. Пытался отследить как, но пока ума не хватило.
Да так же как и в обычных запросах:
SELECT COUNT(*) ...
потом
SELECT FIRST x SKIP y ...



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version