Шаг 204.
Основы языка Python.
Доступ к базе данных SQLite из Python. Создание пользовательской сортировки

    На этом шаге мы рассмотрим алгоритм реализации указанной операции.

    По умолчанию сортировка с помощью инструкции 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 Единый 

    На следующем шаге мы рассмотрим поиск без учета регистра символов.




Предыдущий шаг Содержание Следующий шаг