python - 如何在 MySQL 数据库中使用 UUID 而不是整数

标签 python mysql uuid

我想使用 python 的 uuid() 函数来分配我的 MySQL id,而不仅仅是一个整数和 AUTOINCREMENT

但是,如果在创建对象时生成 uuid() 也会很好。我以前没有广泛使用过 SQL。所以,我能看到的唯一方法是在 python 代码中创建一个新对象时,运行 uuid() 并手动分配它,但这似乎没有必要。

有没有办法将其集成到 MySQL 数据库中?

如果是这样,我应该为该列分配什么数据类型?变种?

最佳答案

MySQL 没有真正的 UUID 支持——您可以将 UUID 存储在 CHAR(32) 列中,尽管您的索引可能不喜欢它。

The SQLAlchemy docs提供以下将 Python 的 uuid 与任何数据库一起使用的方法:

from sqlalchemy.types import TypeDecorator, CHAR
from sqlalchemy.dialects.postgresql import UUID
import uuid

class GUID(TypeDecorator):
    """Platform-independent GUID type.

    Uses Postgresql's UUID type, otherwise uses
    CHAR(32), storing as stringified hex values.

    """
    impl = CHAR

    def load_dialect_impl(self, dialect):
        if dialect.name == 'postgresql':
            return dialect.type_descriptor(UUID())
        else:
            return dialect.type_descriptor(CHAR(32))

    def process_bind_param(self, value, dialect):
        if value is None:
            return value
        elif dialect.name == 'postgresql':
            return str(value)
        else:
            if not isinstance(value, uuid.UUID):
                return "%.32x" % uuid.UUID(value)
            else:
                # hexstring
                return "%.32x" % value

    def process_result_value(self, value, dialect):
        if value is None:
            return value
        else:
            return uuid.UUID(value)

通过使用此代码段,您还可以保持以后切换到 Postgres 的可能性,该数据库确实具有 native UUID 支持。

关于初始化对象:当你创建一个新对象时,你可以分配一个新的uuid.uuid4();数据库(尤其是不支持 UUID 的数据库)无法为您执行此操作。

关于python - 如何在 MySQL 数据库中使用 UUID 而不是整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21102312/

相关文章:

mysql - 按月分组并返回结果为 0 的月份按年过滤

php - 如何选择时间戳列

java - 为什么 UUID.fromString() 不会为此 UUID 抛出 IllegalArgumentException ?

auto-increment - 我应该在 MongoDB 中实现自动递增吗?

MySQL更新 'categories'链接表

uuid - 我应该检查 UUID 冲突吗?

python - 如何找到我的网络托管 django 应用程序的访问者数量?

python - XLSXWriter num_format 来分隔千、百万甚至十亿?

python - 使用 Python 请求登录 Morningstar.com

python - 如何将 conda 环境添加到 jupyter 实验室