首页 > 解决方案 > 使用 JayDeBeApi 存储 MySQL 二进制文件(16)

问题描述

我需要使用JayDeBeApibinary(16)将 UUID 存储在 MySQL 中,它在后台使用 JDBC。当我尝试使用 Python 字节保存数据时,数据未正确转换/或存储。

使用一个参数时

curs.execute('INSERT INTO `user` (userId) VALUES (?)',
             (uuid.uuid4().bytes))

有以下错误:

参数索引超出范围(2 > 参数数量,即 1)。

使用两个参数时

curs.execute('INSERT INTO `user` (userId,username) VALUES (?, ?)',
             (uuid.uuid4().bytes, 'some_user'))

没有错误,但数据没有正确存储

mysql> select * from user;
+------------------------------------+-----------+
| userId                             | username  |
+------------------------------------+-----------+
| 0x00000000000000000000000000000000 | some_user |
+------------------------------------+-----------+

当我使用pymysql它时,它工作得很好uuid.uuid4().bytes。那么使用 JayDeBeApi 保存字节(或只是 UUID)的正确方法是什么?

这是一个可重现的例子

更新:(仍然开放)

所以我找到了使用该功能的解决方案。UNHEX()问题是该UNHEX()功能不可移植。我从pymysqlto切换的原因jaydebeapi是因为我需要使用 H2 进行测试。而 H2 显然没有同样的功能。因此,如果有人有不涉及使用此功能(或任何功能)的不同解决方案,我会更喜欢该解决方案。

所以目前,这个问题仍然悬而未决。

标签: pythonmysqljdbcuuidjaydebeapi

解决方案


注意:不是一个完整的解决方案。我仍在寻找一种不使用函数的方法来执行此操作,因为该函数不可移植。

因此,在Inserting and selection UUIDs as binary(16)的帮助下,我最终使用该UNHEX函数来取消对实际 UUID 字符串进行十六进制处理。

curs.execute("INSERT INTO `user` (userId,username) VALUES (UNHEX(?), ?)",
             (user_id.hex, 'some_user'))
mysql> select * from user;
+------------------------------------+-----------+
| userId                             | username  |
+------------------------------------+-----------+
| 0x7F69F93B0E9F48D0AE8C7D04C78B530F | some_user |
+------------------------------------+-----------+

此外,关于元组的“一个参数”问题,dabblack似乎是正确的。当我尝试使用一个参数时,如果我不添加逗号,它确实可以正常工作。我不是 Python 用户,所以这对我来说是新的。

curs.execute("INSERT INTO `user` (userId) VALUES (UNHEX(?))",
            (user_id.hex,))

推荐阅读