Как конвертировать сырой SQL в SQLAlchemy ORM - PullRequest
0 голосов
/ 29 декабря 2018

У меня в 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, найти все смежные узлы с этой сущностью.

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