Шаг 208.
Основы языка Python.
Доступ к базе данных SQLite из Python. Преобразование типов данных (окончание)

    На этом шаге мы рассмотрим еще несколько вопросов, связанных с преобразованием данных.

    Чтобы восстановить объект Python из значения типа, поддерживаемого SQLite, следует зарегистрировать функцию обратного преобразования типов данных с помощью функции register_converter(). Функция имеет следующий формат:

  register_converter(<Тип данных>, <Ссылка на функцию>)

    В первом параметре указывается преобразуемый тип данных в виде строки, а во втором - задается ссылка на функцию, которая будет использоваться для преобразования типа данных. Функция должна принимать один параметр и возвращать преобразованное значение.

    Чтобы интерпретатор смог определить, какую функцию необходимо вызвать для преобразования типа данных, следует явно указать местоположение метки с помощью параметра detect_types функции connect(). Параметр может принимать следующие значения (или их комбинацию через оператор |):

    Выведем сохраненное значение из таблицы cars1:

# -*- coding: utf-8 -*-
import sqlite3, sys

class Car:
    def __init__(self, model, color):
        self.model, self.color = model, color
    def __repr__(self):
        s = "Модель: {0}, цвет: {1}".format(self.model, self.color)
        return s

def my_converter(value):
    value = str(value, "utf-8")
    model, color = value.split("|")
    return Car(model, color)

# Регистрируем функцию для преобразования типа
sqlite3.register_converter("mycar", my_converter)
con = sqlite3.connect("catalog.db",
                      detect_types=sqlite3.PARSE_COLNAMES)
cur = con.cursor()
cur.execute("""SELECT model as "c [mycar]" FROM cars1""")
print(cur.fetchone()[0])
# Результат: Модель: ВАЗ-2109, цвет: красный
con.close()
input()
Архив с файлом можно взять здесь.

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

Модель: BA3-2109, цвет: красный

    Теперь выведем значение из таблицы cars2, где мы указали тип данных прямо при создании поля:

# -*- coding: utf-8 -*-
import sqlite3, sys

class Car:
    def __init__(self, model, color):
        self.model, self.color = model, color
    def __repr__(self):
        s = "Модель: {0}, цвет: {1}".format(self.model, self.color)
        return s

def my_converter(value):
    value = str(value, "utf-8")
    model, color = value.split("|")
    return Car(model, color)

# Регистрируем функцию для преобразования типа
sqlite3.register_converter("mycar", my_converter)
con = sqlite3.connect("catalog.db",
                      detect_types=sqlite3.PARSE_DECLTYPES)
cur = con.cursor()
cur.execute("SELECT model FROM cars2")
print(cur.fetchone()[0])
# Результат: Модель: Москвич-412, цвет: синий
con.close()
input()
Архив с файлом можно взять здесь.

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

Модель: Москвич-412, цвет: синий

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




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