Python: вставить значение UUID в Sqlite3 - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь вставить значение UUID в базу данных sqlite3 как

INSERT INTO user (user_id,username, email) VALUES (uuid.UUID('7005d0e0-f25b-45f9-897d-bae151fddaff'),'user', 'user@gmail.com')

И я сохраняю значение UUID в базе данных как пользовательский тип данных «GUID». Для этого преобразования я использую конвертер sqlite3 как

sqlite3.register_converter('GUID', lambda b: uuid.UUID(bytes_le=b))

Проблема с этим запросом, выполнение запроса завершается с ошибкой как:

sqlite3.OperationalError: near "(": syntax error

Я что-то упустил? Я хочу сохранить значение UUID в базе данных.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Вы помещаете код 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() экземпляр из сохраненных байтов.

0 голосов
/ 16 мая 2018

uuid.UUID не является функцией SQL, поэтому ее нельзя использовать в запросе SQL.

Вы должны использовать параметр, чтобы Python мог преобразовать его:

cur.execute("INSERT ... VALUES (?,?,?)",
            (uuid.UUID('7005d0e0-f25b-45f9-897d-bae151fddaff'), 'user', 'user@gmail.com'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...