Postgresql с sqlalchemy игнорирует псевдонимы таблиц - PullRequest
0 голосов
/ 04 октября 2019

Я использую sqlalchemy, чтобы найти связанные компоненты в графе, описываемом ребрами различной массы, хранящимися в аннотированном соотношении M: N.

class Similarity(Base):
    __tablename__ = 'similarities'
    id = Column(Integer, primary_key=True)
    form1_id = Column(String, ForeignKey(Form.id, ondelete="CASCADE"), index=True)
    form2_id = Column(String, ForeignKey(Form.id, ondelete="CASCADE"), index=True)
    form1 = relationship(
        Form, foreign_keys=form1_id,
        backref=backref("similarities1"))
    form2 = relationship(
        Form, foreign_keys=form2_id,
        backref=backref("similarities2"))
    score = Column(Float)

[...]

F = aliased(Form)

edges = list(session.query(Form.id).join(
    Similarity, F.id==Similarity.form1_id).join(
        F, Form.id==Similarity.form2_id).add_columns(
            F.id).filter(
                Form.connected_component == component,
                F.connected_component == component,
                Similarity.score < threshold
            ).all())

Это нормально работает в SQLite, но я только что перенесв PostgreSQL, и я получаю следующую ошибку:

2019-10-04 10:54:25,067 INFO sqlalchemy.engine.base.Engine SELECT form.id AS form_id, form_1.id AS form_1_id 
FROM form JOIN similarities ON form_1.id = similarities.form1_id JOIN form AS form_1 ON form.id = similarities.form2_id 
WHERE form.connected_component = %(connected_component_1)s AND form_1.connected_component = %(connected_component_2)s AND similarities.score < %(score_1)s
2019-10-04 10:54:25,067 INFO sqlalchemy.engine.base.Engine {'connected_component_1': 'salt-1', 'connected_component_2': 'salt-1', 'score_1': 0.55}
Traceback (most recent call last):
[...]
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedTable) missing FROM-clause entry for table "form_1"
LINE 2: FROM form JOIN similarities ON form_1.id = similarities.form...
                                       ^
 [SQL: 'SELECT form.id AS form_id, form_1.id AS form_1_id \nFROM form JOIN similarities ON form_1.id = similarities.form1_id JOIN form AS form_1 ON form.id = similarities.form2_id \nWHERE form.connected_component = %(connected_component_1)s AND form_1.connected_component = %(connected_component_2)s AND similarities.score < %(score_1)s'] [parameters: {'connected_component_1': 'salt-1', 'connected_component_2': 'salt-1', 'score_1': 0.55}] (Background on this error at: http://sqlalche.me/e/f405)

Это ошибка в переводе PostgreSQL sqlalchemy или проблема на моем конце? Есть ли обходной путь? Я попытался session.query(Form.id, F.id) вместо session.query(Form.id).add_columns(F.id), с тем же эффектом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...