我写这个问题假设我做错了,而不是这种行为是一个错误。简而言之,我有三个表,A
,B
和C
。 A
与B
存在一对多关系,而B
与多对多关系处于多对多关系C
。我希望能够设置C
和B
之间的关系,以便在我请求与B
关联的C
的集合时,它们会默认排序在A
的日期列中。
这是我正在尝试的实际代码的简化版本。请注意,我正在使用Flask,所以你会在这里看到一些Flask_SQLAlchemy-isms:
from sqlalchemy import Column, Integer, ForeignKey, DateTime
from sqlalchemy.orm import relationship
from app import db
from sqlalchemy.sql.schema import Table
class A(db.Model):
__tablename__ = 'a'
id = Column(Integer, primary_key=True)
date = Column(DateTime, nullable=False)
bs = relationship('B',
back_populates='a',
cascade='all, delete, delete-orphan')
class B(db.Model):
__tablename__ = 'b'
id = Column(Integer, primary_key=True)
a_id = Column(Integer, ForeignKey('a.id'))
a = relationship('A',
back_populates='bs',
lazy='joined',
innerjoin=True)
cs = relationship('C',
secondary='b_to_c',
back_populates='bs')
class C(db.Model):
__tablename__ = 'c'
id = Column(Integer, primary_key=True)
timeStamp = Column(DateTime, index=True, nullable=False)
bs = relationship('B',
secondary='b_to_c',
order_by='A.date',
back_populates='cs')
b_to_c = Table(
'b_to_c',
db.Model.metadata,
Column('b_id', Integer, ForeignKey('b.id')),
Column('c_id', Integer, ForeignKey('c.id'))
)
我认为你可以看到我想要实现的目标,但代码以错误结束。例如,在代码中的其他地方我做了类似
的事情c = C.query.first()
if someObj not in c.bs:
...
它最终会在第二行抛出异常,例如:
sqlalchemy.exc.OperationalError:
(_mysql_exceptions.OperationalError)
(1054, "Unknown column 'a.date' in 'order clause'")
[SQL: 'SELECT b.id AS b_id,
b.a_id AS b_a_id,
a_1.id AS a_1_id,
a_1.date AS a_1_date,
FROM b_to_c, b INNER JOIN a AS a_1 ON a_1.id = b.a_id
WHERE %s = b_to_c.c_id AND b.id = b_to_c.b_id ORDER BY a.date']
[parameters: (2,)]
我注意到,在SQL查询中,a
表引用似乎都用_1
下标,如果我更改ORDER BY
以匹配并手动执行SQL语句,它工作正常。我不知道该下标的目的是什么,但我不知道如何设置表定义,以便它不会发生或ORDER BY
下标匹配。
那么,如何更好地定义表/关系以便我不会遇到这个问题呢?