首页 > 解决方案 > 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 理解为同一件事,但我不知道如何修复它。

标签: pythonsqlalchemy

解决方案


执行查询时不会发生报告的错误(查询本身就可以)但是在尝试访问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 列是sidonthingsextra的外键,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

推荐阅读