You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在Spanner数据库主键列插入UUID转换的整数

问题分析与解决方案

问题根源

  1. 整数范围超出Spanner限制:Spanner的INT64类型是64位有符号整数,最大值为9223372036854775807。你通过uuid.uuid4().int >> 64生成的数值(如示例中的18011687921562567628)远大于这个上限,导致Spanner无法解析。
  2. Default参数错误:你设置default=get_uuid()时,函数会立即执行一次,所有新创建的Roles实例都会复用同一个UUID值,这属于逻辑错误,应该传递函数引用而非执行结果。

解决方案

方案1:修正UUID生成逻辑,确保值在INT64范围内

调整get_uuid函数,生成的整数严格落在Spanner INT64的取值区间内:

import uuid

def get_uuid():
    # 取UUID的低64位,转换为64位有符号整数
    uuid_int = uuid.uuid4().int
    max_int64 = 9223372036854775807
    # 取低64位
    pk = uuid_int & ((1 << 64) - 1)
    # 若超过有符号最大值,转为负数(符合Spanner INT64要求)
    if pk > max_int64:
        pk -= 1 << 64
    return pk

方案2:修正SQLAlchemy字段的Default设置

将default=get_uuid()改为default=get_uuid,确保每次创建新实例时都会生成新的UUID:

class Roles(Base):
    __tablename__ = "roles"
    __table_args__ = (
        Index("roles_name", "name", unique=True),
    )

    id = Column(Integer, primary_key=True, default=get_uuid)  # 去掉括号,传函数引用
    name = Column(String(10), nullable=False)

方案3:改用Spanner原生UUID字符串存储(更推荐)

如果不强制要求整数主键,直接使用UUID字符串类型更直观,也避免整数范围问题:

from sqlalchemy import Column, String, Index
import uuid

class Roles(Base):
    __tablename__ = "roles"
    __table_args__ = (
        Index("roles_name", "name", unique=True),
    )

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    name = Column(String(10), nullable=False)

或者使用SQLAlchemy的UUID类型(需确保Spanner字段映射为STRING(36)):

from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy import Column, Index

class Roles(Base):
    __tablename__ = "roles"
    __table_args__ = (
        Index("roles_name", "name", unique=True),
    )

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    name = Column(String(10), nullable=False)

验证步骤

  1. 确保修改后的代码部署生效
  2. 重新执行插入操作:
>>> role = Roles()
>>> role.name = "Admin"
>>> session.add(role)
>>> session.commit()

此时应该能正常插入数据,不再抛出解析错误。

内容的提问来源于stack exchange,提问作者Jeet Patel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:30:53