使用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
相关产品推荐
相关产品推荐

