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

    На этом шаге мы рассмотрим использование метода 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()
Архив с файлом можно взять здесь.

    Результат работы приложения:

Кино | Музыка | Поисковые порталы | Программирование

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




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