Я использую 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)
, с тем же эффектом.