Найти в Дзене
Kitchen Python 3

Кухня Python 3 "Sqlite3 - %LIKE% utf-8 без учета регистра" пишем собственную функцию

Сегодня мы будем готовить собственную функцию поиска LIKE для в кодировки UTF-8 без учета регистра. Наша кухня успела столкнуться с данной проблемой, когда база уже сварена, а поиск без учета регистра корректно работает только с ascii. Не переделывать же готовое блюдо, правильно? Можно приправить его и подать на стол! ВНИМАНИЕ: Сервис удаляет начальные пробелы в строках, поэтому приходится использовать символ нижнего подчеркивания вместо каждого пробела. И я буду предоставлять скриншоты общего кода для наглядности Для начала скажу, что мы будем пользоваться готовым блюдом предыдущего урока, ссылка на него будет в конце рецепта. Ингредиенты: Python 3 Готовая база данных с прошлого рецепта Библиотека sqlite3 PyCharm по вкусу Приготовление: 1. Подключите библиотеку sqlite3 import sqlite3 2. Напишите функцию для перевода строки в нижний регистр, которую мы и добавим в базу. def lower_string(_str):
____return _str.lower() 3. Сделайте input, через который мы будем получать искомую строк
Оглавление

Сегодня мы будем готовить собственную функцию поиска LIKE для в кодировки UTF-8 без учета регистра. Наша кухня успела столкнуться с данной проблемой, когда база уже сварена, а поиск без учета регистра корректно работает только с ascii. Не переделывать же готовое блюдо, правильно? Можно приправить его и подать на стол!

ВНИМАНИЕ: Сервис удаляет начальные пробелы в строках, поэтому приходится использовать символ нижнего подчеркивания вместо каждого пробела. И я буду предоставлять скриншоты общего кода для наглядности

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

Ингредиенты:

Python 3

Готовая база данных с прошлого рецепта

Библиотека sqlite3

PyCharm по вкусу

Приготовление:

1. Подключите библиотеку sqlite3

import sqlite3

2. Напишите функцию для перевода строки в нижний регистр, которую мы и добавим в базу.

def lower_string(_str):
____return _str.lower()

-2
3. Сделайте input, через который мы будем получать искомую строку
-3

4. Подключите базу данных. В моем случае это MyDB.db

conn = sqlite3.connect("MyDB.db")
cursor = conn.cursor()

5. Добавьте функцию в базу

conn.create_function("mylower", 1, lower_string)

Пояснение:

mylower - наименование функции в самой базе, которой мы будем пользоваться.

lower_string - наша созданная функция.

1 - количество аргументов, передаваемых функцией. Если Вы захотите создать класс, то передавать необходимо два параметра(self и _str), будет выглядеть вот так:

conn.create_function("mylower", 2, self.lower_string)

6. Создайте строковый запрос sql

sql = "SELECT name, family, date_born FROM users WHERE mylower(name) LIKE ?"

Пояснение:

name, family, date_born - поля, которые берем из базы

users - таблица из которой вытаскиваем данные

mylower(name) - применяем функцию mylower к полю name по которому и производится поиск

LIKE ? - сам оператор LIKE и ? вместо чего мы подставим данные из строки str

7. Сделайте запрос к базе

cursor.execute(sql, ("%"+str+"%",))

Пояснение:

sql - наш запрос к базе

("%"+str+"%",) - искомая строка. Добавляем % с двух сторон, чтобы искать подстроку и внутри слова. Если Вы хотите преобразовать поиск и находить данные по началу строки, то напишите так (str+"%",), по концу ("%"+ str,). Проще говоря "%" эта та часть строки, которая находится до или после искомого str

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

print(cursor.fetchall())
conn.commit()
conn.close()

Готовое Блюдо:

import sqlite3

def lower_string(_str):
____return _str.lower()

str = input('Введите строку поиска по имени: ')
conn = sqlite3.connect("MyDB.db")
cursor = conn.cursor()
conn.create_function("mylower", 1, lower_string)
sql = "SELECT name, family, date_born FROM users WHERE mylower(name) LIKE ?"
cursor.execute(sql, ("%"+str+"%",))
print(cursor.fetchall())
conn.commit()
conn.close()

-4
-5
Помните, что обычно есть решение проще и быстрее того, что первым приходит вам в голову.
(с) Donald Knuth

-6

Ссылки:

Создание базы данных и добавление записей