У меня в Python установлены следующие модели SQLAlchemy:
class Relation(db.Model):
__tablename__ = 'relations'
relation_id = db.Column(
db.Integer,
primary_key=True,
autoincrement=True)
article_id = db.Column(
db.Integer,
db.ForeignKey("articles.id"),
nullable=False)
entity_id1 = db.Column(
db.Integer,
db.ForeignKey("entities.entity_id"),
nullable=False)
entity_id2 = db.Column(
db.Integer,
db.ForeignKey("entities.entity_id"),
nullable=False)
confidence = db.Column(
db.Integer
)
class Entity(db.Model):
__tablename__ = 'entities'
entity_id = db.Column(
db.Integer,
primary_key=True,
autoincrement=True)
name = db.Column(db.String(128), nullable=False)
И я пытаюсь преобразовать следующую строку запроса SQL в запрос SQLAlchemy (POSTGRES, если это имеет значение), и основная цель состоит в том, чтобыпредотвратить внедрение SQL:
SELECT DISTINCT e.name, e.entity_id FROM entities e RIGHT JOIN
relations r ON e.entity_id=r.entity_id1 OR e.entity_id=r.entity_id2
WHERE (r.entity_id1 = PARAMETER OR r.entity_id2 = PARAMETER)
AND e.entity_id<>PARAMETER;
Вот моя попытка, но я получаю сообщение об ошибке, в котором указывается, что существует проблема с объединением:
relations = db.session.query(Entity).join(Relation.entity_id1)\ .join(Relation.entity_id2).distinct(Entity.name).filter((Relation.entity_id1 == PARAMETER)
| (Relation.entity_id2 == PARAMTER)
& (Entity.entity_id != PARAMETER))
Любая помощь или советы по отладке будутоценили!
Редактировать: дополнительная информация о сценарии использования: «Сущности» - это узлы неориентированного графа, а «Отношения» - ребра.(Relation.entity_id1 | Relation.entity_id2 совпадает с Relation.entity_id2 | Relation.entity_id1) Гарантируется, что у всех источника и адресатов края есть соответствующий узел.Цель задана entity_id = PARAMETER, найти все смежные узлы с этой сущностью.