SQLAlchemy关系primaryjoin转换

时间:2018-02-12 14:27:17

标签: python sqlalchemy

我正在尝试使用关系主连接来连接两个表,其中连接是在table2中查找table1中名称的最长子字符串的结果。这个问题的标准postgres SQL有效 - 我正在尝试将其转换为SQLAlchemy连接。

sql是:

select distinct on (t1.name) t2.name
from table1 t1
join table2 t2
on t1.name like format('%%%s%%', t2.name) order by t1.name desc, char_length(t2.name) desc;

对于table1中的每个名称,它连接table2中的名称,该名称是table1中该名称的最长子字符串。

我面临的问题是将其转换为SQLALchemy关系,即

class Table1(db.Model):
    __tablename__ = 'table1'

...

name = db.Column(db.String)

...

t1t2= db.relationship("Table2", primaryjoin="...")

1 个答案:

答案 0 :(得分:0)

理论上,您可以按照以下方式执行此操作,但我不建议使用基于此类查询的关系。基本上你需要在查询中删除order by。这可以通过子查询完成,如下所示:

select distinct on (t1.name) t2.name
from table1 t1
join table2 t2
on t1.name like format('%%%s%%', t2.name) and char_length(t2.name) = (select max(char_length(t3.name)) from table2 t3 where t1.name like format('%%%s%%', t3.name));

请记住,这可能会将table1中的一行与table2中的多行连接起来。