【问题标题】:Storing MySQL binary(16) with JayDeBeApi使用 JayDeBeApi 存储 MySQL 二进制文件(16)
【发布时间】:2021-11-05 18:20:49
【问题描述】:

我需要在 MySQL 中使用 JayDeBeApi 将 UUID 存储为 binary(16),它在后台使用 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)的正确方法是什么?

Here is a reproducible example.

更新:(仍然开放)

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

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

【问题讨论】:

  • (uuid.uuid4().bytes), ) 需要逗号作为元组可能是一个参数问题。 jdbc连接我不知道。
  • @danblack 我认为这不是问题所在。只有一个参数,我可以省略元组并只传递单个值。当我这样做时,我会收到相同的错误消息。
  • @danblack 我认为你对这部分问题实际上是正确的。

标签: python mysql jdbc uuid jaydebeapi


【解决方案1】:

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

所以在Inserting and selecting 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 was correct 似乎是关于元组的“一个参数”问题。当我尝试使用一个参数时,如果我不添加逗号,它确实可以正常工作。我不是 Python 用户,所以这对我来说是新的。

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

【讨论】:

  • H2 确实有 HEXTORAW,我认为它与 UNHEX 相同。
  • 这最终是一个很好的解决方法,因为 JDBC 没有传递二进制文件。 this blog 建议可能完全使用prepared statement 并使用pstmt.setBytes(1, binaryData) 让jdbc 正确处理它。我想这也暴露了。
  • 选项 3 - 使用 UUID 以便服务器创建 uuid。
  • 谢谢@danblack,我会调查的。
  • 您是如何选择这些或其他选项的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多