На этом шаге мы рассмотрим еще несколько вопросов, связанных с преобразованием данных.
Чтобы восстановить объект Python из значения типа, поддерживаемого SQLite, следует зарегистрировать функцию обратного преобразования типов данных с помощью функции register_converter(). Функция имеет следующий формат:
register_converter(<Тип данных>, <Ссылка на функцию>)
В первом параметре указывается преобразуемый тип данных в виде строки, а во втором - задается ссылка на функцию, которая будет использоваться для преобразования типа данных. Функция должна принимать один параметр и возвращать преобразованное значение.
Чтобы интерпретатор смог определить, какую функцию необходимо вызвать для преобразования типа данных, следует явно указать местоположение метки с помощью параметра detect_types функции connect(). Параметр может принимать следующие значения (или их комбинацию через оператор |):
SELECT model as "c [mycar]" FROM cars1
CREATE TABLE cars2 (model mycar)
Выведем сохраненное значение из таблицы 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, цвет: синий
На следующем шаге мы рассмотрим сохранение в таблице даты и времени.