我正在尝试将 UUID 值插入到 sqlite3 数据库中
INSERT INTO user (user_id,username, email) VALUES (uuid.UUID('7005d0e0-f25b-45f9-897d-bae151fddaff'),'user', 'user@gmail.com')
Run Code Online (Sandbox Code Playgroud)
我将 UUID 值作为自定义数据类型“GUID”存储在数据库中。对于此转换,我使用 sqlite3 转换器作为
sqlite3.register_converter('GUID', lambda b: uuid.UUID(bytes_le=b))
Run Code Online (Sandbox Code Playgroud)
此查询的问题,查询执行失败,因为:
sqlite3.OperationalError: near "(": syntax error
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?我想将 UUID 值存储到数据库中。
您将 Python 代码放入 SQL 表达式中,并注册了一个处理程序以将 SQLite 数据转换为 Python 类型。
为该类型注册一个适配器,然后将 UID 作为 SQL 参数插入。或者在 SQL 查询中传入一个文字字节序列。
适配器非常简单:
sqlite3.register_adapter(uuid.UUID, lambda u: u.bytes_le)
Run Code Online (Sandbox Code Playgroud)
然后您可以将您的实例用作查询参数:
cursor.execute('''
INSERT INTO user (user_id, username, email)
VALUES (?, ?, ?)
''', (
uuid.UUID('7005d0e0-f25b-45f9-897d-bae151fddaff'), 'user',
'user@gmail.com'
))
Run Code Online (Sandbox Code Playgroud)
反过来,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')
Run Code Online (Sandbox Code Playgroud)
在上面的演示中,传入一个uuid.UUID()实例来cursor.execute()触发注册的适配器register_adapter,产生一个字节串插入到数据库列中。
当迭代来自 a 的行时SELECT,sqlite3库GUID从user_id表模式中的列映射类型,并使用register_converter()相同名称的注册uuid.UUID()从存储的字节生成一个实例。
| 归档时间: |
|
| 查看次数: |
2864 次 |
| 最近记录: |