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

使用sqlalchemy-spanner创建示例表时报错求助

解决SQLAlchemy+Spanner创建表时的DDL语法错误及列不存在问题

问题根源

  • 你使用的SQLAlchemy 1.3.0版本过旧,与sqlalchemy-spanner 1.6.2存在兼容性问题,导致DDL语句转换不符合Spanner的语法规范(比如错误地在列后直接添加PRIMARY关键字)。
  • 列不存在的错误大概率是之前错误生成的表结构残留,或是元数据缓存未更新导致的。

解决方案

1. 升级SQLAlchemy到兼容版本

sqlalchemy-spanner 1.6.2要求SQLAlchemy版本至少为1.4.x(推荐1.4.46+),执行以下命令升级:

pip install --upgrade sqlalchemy>=1.4.46

升级后再运行原示例代码,适配器会正确生成符合Spanner要求的DDL语句。

2. 不升级版本的临时修复

如果暂时无法升级SQLAlchemy,可手动改用表级主键约束替代列级primary_key=True,避免适配器生成错误语法:

from sqlalchemy import create_engine, MetaData, Table, Column, String, PrimaryKeyConstraint

PROJECT = "prj***"
INSTANCE = "***"
DATABASE = "**"
URL = f"spanner+spanner:///projects/{PROJECT}/instances/{INSTANCE}/databases/{DATABASE}"
engine = create_engine(URL)

metadata = MetaData(bind=engine)

table = Table(
  "users",
  metadata,
  Column("user_id", String(16)),  # 移除列级primary_key参数
  Column("user_name", String(16), nullable=False),
  PrimaryKeyConstraint("user_id")  # 表级声明主键
)
table.create()

3. 解决「列不存在」错误

  • 登录Spanner控制台,检查目标数据库中是否存在残留的无效users表,若有则删除后重新执行创建代码。
  • 执行代码前清理SQLAlchemy元数据缓存:
    metadata.clear()  # 在创建表之前调用
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:11:10