Python:在 Sqlite3 中插入​​ UUID 值

标签 python sqlite

我正在尝试将 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() 在表schema的列定义中调用,或者在select的列名中使用类型名;您需要告诉 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 库映射了 user_id 中的 GUID 类型表架构中的列,并使用同名的 register_converter() 注册从存储的字节中生成 uuid.UUID() 实例。

关于Python:在 Sqlite3 中插入​​ UUID 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50376345/

相关文章:

c# - 尝试将 Nhibernate 与 Mono 和 SQLite 一起使用 - 找不到 System.Data.SQLite

ios - 同时将数据持久化到多个表中

java - 检查Java netbeans数据库中存在的用户名

java - SQLite DB创建表时名称列错误

android - 如何在 Android SQLite 的列中返回唯一行?

python - 安装和使用无法通过 pip 或 tarball 发行版获得的 python 库的最佳实践

python - 在 BeautifulSoup 中按值查找属性名称(不是反向)

递归函数中的Python返回命令

python - Python 中的 OpenCV - 操作像素

python - lxml XPath 中不需要的命名空间声明