Вы помещаете код Python в выражение SQL и регистрируете обработчик для преобразования данных SQLite в тип Python.
Зарегистрируйте адаптер для типа, затем вставьте UID в качестве параметра SQL. Или передайте буквенную байтовую последовательность в запросе SQL.
Адаптер так же прост, как:
sqlite3.register_adapter(uuid.UUID, lambda u: u.bytes_le)
и затем вы можете использовать свой экземпляр в качестве параметра запроса:
cursor.execute('''
INSERT INTO user (user_id, username, email)
VALUES (?, ?, ?)
''', (
uuid.UUID('7005d0e0-f25b-45f9-897d-bae151fddaff'), 'user',
'user@gmail.com'
))
Чтобы пойти в другом направлении, получая экземпляр uuid.UUID()
из запроса SELECT
, вам нужно либо использовать имя типа в вызове register_converter()
в определении столбца схемы таблицы, либо использовать введите имя в столбце имя выбора; вам нужно сообщить sqlite3
, какие варианты вы планируете использовать в вызове connect()
(это могут быть оба).
Демо-версия:
>>> import uuid, sqlite3
>>> conn = sqlite3.connect(':memory:', detect_types=sqlite3.PARSE_DECLTYPES)
>>> sqlite3.register_adapter(uuid.UUID, lambda u: u.bytes_le)
>>> sqlite3.register_converter('GUID', lambda b: uuid.UUID(bytes_le=b))
>>> conn.execute('CREATE TABLE user (user_id GUID, username TEXT, email TEXT)')
<sqlite3.Cursor object at 0x1074065e0>
>>> with conn:
... cursor = conn.cursor()
... cursor.execute('''
... INSERT INTO user (user_id, username, email)
... VALUES (?, ?, ?)
... ''', (
... uuid.UUID('7005d0e0-f25b-45f9-897d-bae151fddaff'), 'user',
... 'user@gmail.com'
... ))
...
<sqlite3.Cursor object at 0x107406570>
>>> cursor = conn.cursor()
>>> for row in cursor.execute('SELECT * FROM user'):
... print(row)
...
(UUID('7005d0e0-f25b-45f9-897d-bae151fddaff'), 'user', 'user@gmail.com')
В приведенной выше демонстрации передача экземпляра uuid.UUID()
в cursor.execute()
запускает адаптер, зарегистрированный в register_adapter
, создавая строку байтов для вставки в столбец базы данных.
И при итерации по строкам из SELECT
библиотека sqlite3
отображала тип GUID
из столбца user_id
в схеме таблицы и использовала регистрацию register_converter()
с тем же именем для получения uuid.UUID()
экземпляр из сохраненных байтов.