import sqlite3 sqlite3.register_converter(typename, callable)
typename
- тип данных базы данных,callable
- вызываемый объект.Функция register_converter()
модуля sqlite3
регистрирует вызываемый объект callable
для преобразования строки байтов из базы данных в пользовательский тип Python.
Вызываемый объект callable
будет вызываться для всех значений базы данных, имеющих тип typename
.
Присвойте аргументу detect_types
функции sqlite3.connect()
информацию о том, как работает определение типа.
Обратите внимание, что typename
и имя типа в запросе сопоставляются без учета регистра.
import sqlite3 class Point: def __init__(self, x, y): self.x, self.y = x, y def __repr__(self): return "(%f;%f)" % (self.x, self.y) def adapt_point(point): return ("%f;%f" % (point.x, point.y)).encode('ascii') def convert_point(s): x, y = list(map(float, s.split(b";"))) return Point(x, y) # регистрируем адаптер sqlite3.register_adapter(Point, adapt_point) # регистрируем конвертер sqlite3.register_converter("point", convert_point) p = Point(4.0, -3.2) ######################### # 1) Использование объявленных типов con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES) cur = con.cursor() cur.execute("create table test(p point)") cur.execute("insert into test(p) values (?)", (p,)) cur.execute("select p from test") print("with declared types:", cur.fetchone()[0]) cur.close() con.close() ####################### # 1) Использование имен столбцов con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES) cur = con.cursor() cur.execute("create table test(p)") cur.execute("insert into test(p) values (?)", (p,)) cur.execute('select p as "p [point]" from test') print("with column names:", cur.fetchone()[0]) cur.close() con.close()