簡體   English   中英

Python:在Sqlite3中插入UUID值

[英]Python: insert UUID value in Sqlite3

我正在嘗試將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

我有什么想念的嗎? 我想將UU​​ID值存儲到數據庫中。

您將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'
    ))

要從另一個方向獲取一個SELECT查詢中的uuid.UUID()實例,則必須在表模式的列定義中的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 register_adapter的適配器,從而產生一個字節串以插入數據庫列。

並且,當從SELECT遍歷行時, sqlite3庫從表模式中的user_id列映射了GUID類型,並使用了同名的register_converter()注冊從存儲的字節中生成了uuid.UUID()實例。

uuid.UUID不是SQL函數,因此您不能在SQL查詢中使用它。

您必須使用參數,以便Python可以將其轉換:

cur.execute("INSERT ... VALUES (?,?,?)",
            (uuid.UUID('7005d0e0-f25b-45f9-897d-bae151fddaff'), 'user', 'user@gmail.com'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM