我正在使用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)
我在"事物">表中插入了一个项目,但没有在"事物额外"中插入。然后我尝试选择左外连接:
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
看起来它没有将定义的外键理解为同一件事,但我不知道如何解决它。
执行查询时不会发生报告的错误(查询本身没问题(,而是在尝试访问结果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']
由于thingsextra
上的列sid
是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