Python:在Sqlite3中插入UUID值

时间:2018-05-16 16:57:26

标签: 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

我错过了什么吗?我想将UU​​ID值存储到数据库中。

2 个答案:

答案 0 :(得分:2)

uuid.UUID不是SQL函数,因此您无法在SQL查询中使用它。

你必须使用一个参数,以便Python可以转换它:

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

答案 1 :(得分:2)

您正在将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()调用中使用类型名称表模式,或使用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库从表架构中的GUID列映射user_id类型并使用register_converter()注册相同名称以从存储的字节生成uuid.UUID()实例。