Python Glossary English

все Python 3sqlite3функция

sqlite3.register_converter()

адаптеры и конвертеры

Регистрирует функцию, которая превращает прочитанное из базы значение объявленного типа столбца в объект Python. Получает bytes.

Синтаксис

sqlite3.register_converter(typename, converter, /)

Конвертер молчит, пока соединение не открыто с detect_types=sqlite3.PARSE_DECLTYPES (или PARSE_COLNAMES): без этого приходит то, что лежит в базе. Аргумент всегда bytes, не str — нужен .decode(). Для NULL конвертер не вызывается. Имя сверяется с первым словом типа столбца без учёта регистра, но сам SQLite по этому имени выбирает сходство типов: столбец DECIMAL хранит '1.10' как число 1.1, и конвертер получит b'1.1'.

Примеры

import sqlite3
sqlite3.register_converter('point', lambda b: tuple(map(int, b.split(b';'))))
plain = sqlite3.connect(':memory:')
plain.execute('CREATE TABLE p(xy point)')
plain.execute("INSERT INTO p VALUES ('1;2')")
print(plain.execute('SELECT xy FROM p').fetchone())  # → ('1;2',) — без detect_types
plain.close()
conn = sqlite3.connect(':memory:', detect_types=sqlite3.PARSE_DECLTYPES)
conn.execute('CREATE TABLE p(xy POINT)')
conn.execute("INSERT INTO p VALUES ('1;2'), (NULL)")
print(conn.execute('SELECT xy FROM p').fetchall())  # → [((1, 2),), (None,)]
conn.close()
import sqlite3
from decimal import Decimal
sqlite3.register_converter('decimal', lambda b: Decimal(b.decode()))
conn = sqlite3.connect(':memory:', detect_types=sqlite3.PARSE_DECLTYPES)
conn.execute('CREATE TABLE p(price DECIMAL)')
conn.execute('INSERT INTO p VALUES (?)', ('1.10',))
print(conn.execute('SELECT price FROM p').fetchone())  # → (Decimal('1.1'),) — ноль потерян
conn.close()

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности