【发布时间】:2014-04-10 12:00:53
【问题描述】:
我正在尝试将以下 SQL 编写为 SQLAlchemy 查询:
SELECT COALESCE((
SELECT client_id
FROM client_subclient_map m
WHERE m.subclient_id = brands.client_id
LIMIT 1),
client_id)
FROM brands
WHERE id = $1;
我目前有函数:
def client_subclient_map(self):
return self.session.query(ClientSubclientMap).\
filter(ClientSubclientMap.subclient_id==Brand.client_id).\
limit(1).\
subquery()
创建以下子查询:
SELECT client_subclient_map.client_id, client_subclient_map.subclient_id
FROM client_subclient_map, brands
WHERE client_subclient_map.subclient_id = brands.client_id
LIMIT :param_1
主要功能:
def top_client(self, brand_id):
clientmap_alias = aliased(ClientSubclientMap, self.client_subclient_map())
self.query = self.session.query(
func.coalesce(
clientmap_alias.client_id, Brand.client_id
)).\
filter(Brand.id==brand_id)
print self.query
return self
创建查询:
SELECT coalesce(:param_1, brands.client_id) AS coalesce_1
FROM brands
WHERE brands.id = :id_1
然后我就打电话
def get(self):
return self.query.first()
合并后由我的函数创建的完整查询如下所示:
SELECT coalesce(anon_1.client_id, brands.client_id) AS coalesce_1
FROM (
SELECT client_subclient_map.client_id AS client_id,
client_subclient_map.subclient_id AS subclient_id
FROM client_subclient_map, brands
WHERE client_subclient_map.subclient_id = brands.client_id
LIMIT :param_1) AS anon_1,
brands
WHERE brands.id = :id_1
这是错误的,因为 select 子查询发生在错误的位置,它需要发生在 coalesce 函数内部而不是 FROM 子句中才能起作用。
我是 SQLAlchemy 的新手,所以它也可能是我设置中其他地方的一个问题。我确实在 ClientSubclientMap 表的 client_id 和 subclient_id 列上都有 ForeignKey 引用,但是两个外键引用同一列 Client.id 存在一些问题,因此我删除了 ClientSubclientMap.client 外键引用。
sqlalchemy.exc.AmbiguousForeignKeysError: Could not determine join condition
between parent/child tables on relationship ClientSubclientMap.subclients -
there are multiple foreign key paths linking the tables. Specify the
'foreign_keys' argument, providing a list of those columns which should be
counted as containing a foreign key reference to the parent table.
【问题讨论】:
-
该错误消息与您上面说明的代码无关。在您的映射中的某处,您有一个名为“子客户端”的关系附加到一个名为 ClientSubclientMap 的类,它需要更多关于如何加入其目标类的详细信息。当您找到该映射时,请参阅 handling multiple join paths 了解如何解决的背景信息。
标签: sqlalchemy foreign-keys subquery coalesce