Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 20, 2011 00:04:39

proft
От:
Зарегистрирован: 2009-08-11
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy и поиск текста

Есть gtk-приложение, которое хранит данные в sqlite-бд.

Модель создаю так

class Patient(Base):
lastname = Column(Unicode)
Поиск делаю так

patients = self.session.query(Patient)

lastname = unicode(self.lastname_entry.get_text())
if lastname:
patients = patients.filter(Patient.lastname.like(u"%%%s%%" % lastname))
Если ввести фамилию ‘Иванов’, то все ок, находит. Если ввести ‘иванов’, то ничего не находит.

Поиск напрямую через SQLite manager работает правильно:

SELECT * FROM patients WHERE lastname LIKE "%иванов%"
Что надо добавить к sqlalchemy что бы оно искало правильно? ilike не предлагать, не работает.



Офлайн

#2 Янв. 20, 2011 11:48:23

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

sqlalchemy и поиск текста

Сталкивался с этим на sqlite3, правда без sqlalchemy. Решил так:

con=sqlite.connect(database)
con.create_function('myLower',1,lambda x:x.lower())
db=con.cursor()
db.execute('select * from content where myLower(article) like ?')



Офлайн

#3 Янв. 20, 2011 15:37:54

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2255
Репутация: +  40  -
Профиль   Отправить e-mail  

sqlalchemy и поиск текста

.ilike()

Офлайн

#4 Янв. 20, 2011 20:15:17

proft
От:
Зарегистрирован: 2009-08-11
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy и поиск текста

igor.kaist
Сталкивался с этим на sqlite3, правда без sqlalchemy. Решил так:
con=sqlite.connect(database)
con.create_function('myLower',1,lambda x:x.lower())
db=con.cursor()
db.execute('select * from content where myLower(article) like ?')
спс, вариант конечно, но я думаю что есть еще проще решение

slav0nic
.ilike()
в своем первом сообщении писал что не работает



Отредактировано (Янв. 20, 2011 20:18:25)

Офлайн

#5 Янв. 20, 2011 21:26:16

proft
От:
Зарегистрирован: 2009-08-11
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy и поиск текста

Обновил pysqlite и SQLAlchemy - без результатно.

Смотрю что лежит в бд

In [28]: p.lastname
Out[28]: u'\u0413\u0430\u043f\u0447\u0443\u043a'
Делаю поиск с отображением sql-запроса

In [29]: patients.filter(Patient.lastname.ilike(u"%%%s%%" % l.decode('utf-8'))).count()

2011-01-20 21:20:30,950 INFO sqlalchemy.engine.base.Engine.0x...1250 SELECT count(1) AS count_1
FROM patients
WHERE lower(patients.lastname) LIKE lower(?)
2011-01-20 21:20:30,950 INFO sqlalchemy.engine.base.Engine.0x...1250 (u'%\u0433\u0430\u043f\u0447\u0443\u043a%',)
Out[29]: 0
Видно что строка совпадает, за исключением первой буквы.

Складывается такое предчувствие что в SQLAlchemy функция lower не умеет работать с unicode.



Офлайн

#6 Янв. 20, 2011 23:43:11

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2255
Репутация: +  40  -
Профиль   Отправить e-mail  

sqlalchemy и поиск текста

тут бок с sqlite3, почитай http://www.sqlite.org/optoverview.html#like_opt и http://ioannis.mpsounds.net/blog/2009/01/11/sqlite3_unicode-updated-for-sqlite3-v367/
ну и судя из той же доки, lower будет работать для utf-8 только с ICU extension.

Офлайн

#7 Янв. 21, 2011 17:57:27

proft
От:
Зарегистрирован: 2009-08-11
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy и поиск текста

slav0nic
тут бок с sqlite3, почитай http://www.sqlite.org/optoverview.html#like_opt и http://ioannis.mpsounds.net/blog/2009/01/11/sqlite3_unicode-updated-for-sqlite3-v367/
ну и судя из той же доки, lower будет работать для utf-8 только с ICU extension.
Нашел на хабре похожий топик SQLite и полноценный UNICODE но как-то теплее не стало :)

Майк Байер (автор SQLAlchemy) в google groups начал ответ многообещающе: “That's SQLite's lower() function.” :)



Отредактировано (Янв. 21, 2011 18:01:34)

Офлайн

#8 Авг. 7, 2015 10:03:23

javum
Зарегистрирован: 2015-08-07
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy и поиск текста

igor.kaist
Сталкивался с этим на sqlite3, правда без sqlalchemy.
Спасибо! Работает!
Пишу тут прогу для самообучения на pyqt+sqlalchemy(sqlite3) и столкнулся с этой проблемой (поиск по русским полям зависит от регистра).
2 дня гуглил, обчитывался форумов, но так и не нашел “правильных” примеров…
“Правильных” в плане, когда уже вся логика в программе завязана на объекты sqlalchemy, а тут бац и ResultProxy.
Пока решил так, что получаю id-шники нужных записей в ResultProxy, потом конвертирую в список и уже делаю выборку всех строк по id из списка с помощью sqlalchemy.
Адский костыль…

Может, за 4 года что-то изменилось? И есть правильное решение, как прикрутить свою функцию к sqlite, чтобы использовать ее в запросах и получать объекты sqlalchemy?

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version