На этом шаге мы рассмотрим использование метода create_aggregate().
При изучении SQLite мы рассматривали встроенные афегатные функции COUNT(), MIN(), MAX (), AVG (), SUM (), TOTAL () и GROUP_CONCAT (). Если возможностей этих функций окажется недостаточно, то можно определить пользовательскую агрегатную функцию. Связать название функции в SQL-запросе с пользовательским классом в программе позволяет метод create_aggregate() объекта соединения. Формат метода:
create_aggregate(<Название функции в SQL-запросе в виде строки>, <Количество параметров>, <Ссылка на класc>)
В первом параметре указывается название создаваемой агрегатной функции в виде строки. В третьем параметре передается ссылка на класс (название класса без круглых скобок). Этот класс должен поддерживать два метода: step() и finalize(). Метод step() вызывается для каждой из обрабатываемых записей, и ему передаются параметры, количество которых задается во втором параметре метода create_aggregate(). Метод finalize() должен возвращать результат выполнения. Для примера выведем все названия рубрик в алфавитном порядке через разделитель:
# -*- coding: utf-8 -*- import sqlite3 class MyClass: def __init__(self): self.result = [] def step(self, value): self.result.append(value) def finalize(self): self.result.sort() return " | ".join(self.result) con = sqlite3.connect("catalog.db") # Связываем имя "myfunc" с классом MyClass con.create_aggregate("myfunc", 1, MyClass) cur = con.cursor() cur.execute("SELECT myfunc(name_rubr) FROM rubr") print(cur.fetchone()[0]) #Результат: Кино | Музыка | Поисковые порталы | Программирование cur.close() con.close() input()
Результат работы приложения:
Кино | Музыка | Поисковые порталы | Программирование
На следующем шаге мы рассмотрим преобразование типов данных.