SQLAlchemy跨PostgreSQL schema创建外键提示找不到引用表如何解决?
问题原因及修复方案
核心错误原因
你触发报错的原因来自三个配置疏漏:
- 外键引用未指定完整schema路径:你创建的
training表归属于apischema,外键仅写model.id时,SQLAlchemy默认会从当前表所属的apischema下查找关联表,自然找不到public下的表 - 表名拼写不匹配:你给出的目录结构中public下的表名为
models,但代码中外键引用的是model.id,表名少了后缀s - 未提前反射存量表结构:你使用的
MetaData对象中没有加载public下已存在的models表结构,SQLAlchemy做外键校验时无法识别该表存在
修复后代码
from sqlalchemy import create_engine, MetaData, Table, Column, String, ForeignKey class __PostgresService: def __init__(self): self.__client = create_engine("postgresql://postgres@localhost:5432/database") # 不指定全局默认schema,避免跨schema引用的路径解析冲突 metadata = MetaData(self.__client) # 提前反射public下已存在的models表结构到元数据对象 metadata.reflect(schema="public", only=["models"]) self.__table = Table("training", metadata, Column("id", String, primary_key=True, nullable=False), # 外键写全schema.表名.字段路径,匹配实际存量表 Column("model_id", ForeignKey("public.models.id"), nullable=False), schema="api") metadata.create_all() postgres_service = __PostgresService()
补充说明
如果你的public下实际表名确实是model而非models,把外键路径中的public.models.id改成public.model.id即可。
内容的提问来源于stack exchange,提问作者Ronny Efronny
相关产品推荐
相关产品推荐

