Две арифметические операции в primaryjoin and_ вызывают сбой - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть система управления версиями аннотаций

class Annotation(db.Model):
    id = db.Column(db.Integer, primary_key=True)

class AnnotationVersion(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    book_id = db.Column(db.Integer, db.ForeignKey("book.id"))
    previous_id = db.Column(db.Integer, db.ForeignKey("post_version.id"), default=None)
    pointer_id = db.Column(db.Integer, db.ForeignKey("annotation.id"))
    current = db.Column(db.Boolean, index=True)
    first_line_num = db.Column(db.Integer)
    last_line_num = db.Column(db.Integer)

class Line(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    book_id = db.Column(db.Integer, db.ForeignKey("book.id")
    line = db.Column(db.String(255))

У меня есть следующие два отношения в классе Annotation:

lines = db.relationship("Line", secondary="annotation_version",
        primaryjoin="and_(Annotation.id==AnnotationVersion.pointer_id,"
            "AnnotationVersion.current==True)",
        secondaryjoin="and_(Line.l_num>=AnnotationVersion.first_line_num,"
            "Line.l_num<=AnnotationVersion.last_line_num,"
            "Line.book_id==AnnotationVersion.book_id)",
        viewonly=True, uselist=True)
context = db.relationship("Line", secondary="annotation_version",
        primaryjoin="and_(Annotation.id==AnnotationVersion.pointer_id,"
            "AnnotationVersion.current==True)",
        secondaryjoin="and_(Line.l_num>=AnnotationVersion.first_line_num-5,"
            "Line.l_num<=AnnotationVersion.last_line_num+5,"
            "Line.book_id==AnnotationVersion.book_id)",
        viewonly=True, uselist=True)

Как видите, контекст - это просто first_line_num-5 и last_line_num+5; другими словами, контекст аннотации - это просто предыдущие пять и следующие пять строк фактического текста аннотации.

Я пытаюсь определить те же отношения контекста для фактического AnnotationVersion:

context = db.relationship("Line",
    primaryjoin="and_(Line.l_num>=AnnotationVersion.first_line_num-5,"
        "Line.l_num<=AnnotationVersion.last_line_num+5,"
        "Line.book_id==AnnotationVersion.book_id)",
        viewonly=True, uselist=True)

Но это точное определение всегда возвращает ошибку

sqlalchemy.exc.ArgumentError: Не удалось найти какой-либо соответствующий иностранный ключевые столбцы для условия первичного соединения 'line.l_num> = annotation_version.first_line_num -: first_line_num_1 И line.l_num <= annotation_version.last_line_num +: last_line_num_1 AND line.book_id = annotation_version.book_id 'для отношений AnnotationVersion.context. Убедитесь, что ссылающиеся столбцы связаны с ForeignKey или ForeignKeyConstraint, или аннотированы в условии соединения с внешней () аннотацией. </p>

Если я удалю +5 или -5, это сработает. Но как только я определяю оба, я получаю эту ошибку.

Что может вызвать этот конкретный сбой? Как вы можете видеть, это происходит только в том случае, если оно определено в условии primaryjoin, поскольку оно прекрасно работает как условие secondaryjoin.

1 Ответ

0 голосов
/ 14 ноября 2018

Ссылка Ильи Эверилы на документацию помогла решить эту проблему. Все, что мне нужно было сделать, это указать foreign_key параметр:

context = db.relationship("Line",
    primaryjoin="and_(Line.l_num>=AnnotationVersion.first_line_num-5,"
        "Line.l_num<=AnnotationVersion.last_line_num+5,"
        "Line.book_id==AnnotationVersion.book_id)",
        foreign_keys=[first_line_num, last_line_num],
        viewonly=True, uselist=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...