На этом шаге мы рассмотрим алгоритм реализации указанной операции.
По умолчанию сортировка с помощью инструкции ORDER BY зависит от регистра символов. Например, если сортировать слова единица1, Единица2 и Единый, то в результате мы получим неправильную сортировку: Единица2, Единый и лишь затем единица1. Модуль sqlite3 позволяет создать пользовательскую функцию сортировки и связать ее с названием функции в SQL-запросе. В дальнейшем это название можно указать в инструкции ORDER BY после ключевого слова COLLATE.
Связать название функции в SQL-запросе с пользовательской функцией в программе позволяет метод create_collation() объекта соединения. Формат метода:
create_collation(<Название функции в SQL-запросе в виде строки>, <Ссылка на функцию сортировки>)
Функция сортировки принимает две строки и должна возвращать:
Обратите внимание на то, что функция сортировки будет вызываться только при сравнении текстовых значений. При сравнении чисел эта функция работать не будет.
Для примера создадим новую таблицу с одним полем, вставим три записи, а затем произведем сортировку стандартным методом и с помощью пользовательской функции:
# -*- coding: utf-8 -*- import sqlite3 def myfunc(s1, s2): # Пользовательская функция сортировки s1 = s1.lower() s2 = s2.lower() if s1 == s2: return 0 elif s1 > s2: return 1 else: return -1 con = sqlite3.connect(":memory:", isolation_level=None) # Связываем имя "myfunc" с функцией myfunc() con.create_collation("myfunc", myfunc) cur = con.cursor() cur.execute("CREATE TABLE words (word TEXT)") cur.execute("INSERT INTO words VALUES('единица1')") cur.execute("INSERT INTO words VALUES('Единый')") cur.execute("INSERT INTO words VALUES('Единица2')") # Стандартная сортировка cur.execute("SELECT * FROM words ORDER BY word") for line in cur: print (line[0], end=" ") # Результат: Единица2 Единый единица1 print () # Пользовательская сортировка cur.execute("""SELECT * FROM words ORDER BY word COLLATE myfunc""") for line in cur: print(line[0], end=" ") # Результат: единица1 Единица2 Единый cur.close () # Закрываем объект-курсор con.close () # Закрываем соединение input ()
Результат работы приложения:
Единица2 Единый единица1
единица1 Единица2 Единый
На следующем шаге мы рассмотрим поиск без учета регистра символов.