[英]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
我有什么想念的嗎? 我想將UUID值存儲到數據庫中。
您將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.