python - SQLAlchemy 核心从(0..1)一对一关系中的连接表中选择引发不明确的名称 InvalidRequestError
问题描述
我正在使用 SQLAlchemy 核心(版本 1.13.12)定义两个表,它们必须具有一对一(0..1)关系:
things = sa.Table(
"things",
metadata,
sa.Column("sid", sa.Integer, primary_key=True),
sa.Column("info", sa.String)
)
thingsextra = sa.Table(
"thingsextra",
metadata,
sa.Column("sid", sa.Integer, sa.ForeignKey(things.c.sid), primary_key=True),
sa.Column("moreinfo", sa.String)
fullthings = sa.join(things, thingsextra, isouter=True)
我在“things”表中插入了一个项目,但没有在“thingsextra”中插入。然后我尝试选择左外连接:
query = fullthings.select().where(things.c.sid == sid)
result = conn.execute(query).fetchone()
我收到以下异常:
sqlalchemy.exc.InvalidRequestError: Ambiguous column name 'sid' in result set column descriptions
看起来它没有将定义的 ForeignKey 理解为同一件事,但我不知道如何修复它。
解决方案
执行查询时不会发生报告的错误(查询本身就可以)但是在尝试访问sid
结果列时:
>>> result.sid
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
sqlalchemy.exc.InvalidRequestError: Ambiguous column name 'sid' in result set column descriptions
原因是您的 SELECT 包含两列同名sid
,一列来自things
表,另一列来自thingsextra
您加入它们时。您可以通过显示result.keys()
>>> result.keys()
['sid', 'info', 'sid', 'moreinfo']
由于 on 列是sid
onthingsextra
的外键,sid
因此things
您可以从 SELECT 中删除此列,使其仅包含一sid
列。您可以通过选择查询中需要的列来执行此操作with_only_columns
>>> query = fullthings.select().with_only_columns([things.c.sid, things.c.info, thingsextra.c.moreinfo]).where(things.c.sid == 1)
>>> result = connection.execute(query).fetchone()
>>> result.keys()
['sid', 'info', 'moreinfo']
>>> result.sid
1
推荐阅读
- assembly - PC Speaker 程序在 MS-DOS 下工作异常
- sql - Golang / GO:我想从 golang 中的 oracle 数据库中读取数据,但简而言之,在我当前的工作目录中的 TDM-GCC-64 文件夹之外
- spring - Graphql 工具:将实体类型映射到 graphql 类型
- visual-studio-code - VS 代码:Settings.json 中的动态值
- c - 指向三个不同链表的指针的问题
- angular - Angular - 使用模型中的计算属性
- android - 使用协程流程->收集时房间冻结
- c# - 调整列的大小在 wpf DataGrid 中不起作用
- ansible - 需要在 Ansible 中使用主机变量(ansible engine 2.8 & ansible tower 3.5)
- reactjs - 可以在 react-select (ReactJS) 上更改字体颜色吗?