SQLAlchemy按表中的另一种关系排序关系

时间:2017-11-25 23:40:23

标签: python mysql sqlalchemy flask-sqlalchemy

我写这个问题假设我做错了,而不是这种行为是一个错误。简而言之,我有三个表,ABCAB存在一对多关系,而B多对多关系处于多对多关系C。我希望能够设置CB之间的关系,以便在我请求与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下标匹配。

那么,如何更好地定义表/关系以便我不会遇到这个问题呢?

0 个答案:

没有答案