python如何实现MySQL中的UUID_TO_BIN()方法?

数据库中使用BINARY(16)来存储UUID_TO_BIN(UUID(),1)返回的结果并作为主键。
使用python,如何将uuid.uuid1()生成的UUID对象转换成与UUID_TO_BIN()对应的结果?

import uuid

source_uuid = uuid.uuid1()
# a498ad34-9426-11ed-81bd-28d2441b950f    <class 'uuid.UUID'>    36

str_uuid = str(uuid.uuid1()).replace('-', '')
sorted_uuid = str_uuid[12:16] + str_uuid[8:12] + str_uuid[0:8] + str_uuid[16:]
# 11ed9426a498ae1081bd28d2441b950f    <class 'str'>    32

fromhex_uuid = bytes.fromhex(sorted_uuid)
# b'\x11\xed\x94&\xa4\x98\xae\x10\x81\xbd(\xd2D\x1b\x95\x0f'    <class 'bytes'>    16
# 这个好像可以,但能不能把后边的反斜杠去掉呢?

encode_uuid = sorted_uuid.encode('utf-8')
# b'11ed9426a498ae1081bd28d2441b950f'    <class 'bytes'>    32

image.png

哪位大神有好的方法呢?望不吝赐教!

阅读 3k
2 个回答

数据库中保存的就是字节数据. 执行 字节.hex() 就是你要的16进制表示了.

bytes.fromhex('414243') b'abc'.hex()

在Python中,可以使用 built-in 模块 struct 来将 UUID 对象转换为二进制字符串。

import struct
import uuid

def uuid_to_bin(uuid_object):
    return struct.pack('>QQ', uuid_object.int >> 64, uuid_object.int & ((1 << 64) - 1))

# Example usage
uuid_object = uuid.uuid1()
uuid_bin = uuid_to_bin(uuid_object)

上述代码生成的 uuid_bin 就是对应 UUID_TO_BIN(UUID(),1) 的结果,可以用来存储在数据库中的BINARY(16)字段中。

注意:如果需要存储在数据库中的UUID是小端序,可以使用struct.pack('<QQ', uuid_object.int >> 64, uuid_object.int & ((1 << 64) - 1))

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题