У меня есть система управления версиями аннотаций
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
.