sqlalchemy несколько вложенных запросов с фильтрами из одной таблицы AttributeError: объект 'tuple' не имеет атрибута 'filter' - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть одна таблица,

class Sale(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    vente_no = db.Column(db.String(50))
    lampshade = db.Column(db.String(30))
    brocante = db.Column(db.String(30))
    buyer = db.Column(db.String(255))
    pays = db.Column(db.String(255))
    QT = db.Column(db.Integer)
    prix_de_vente = db.Column(db.Float)
    poste = db.Column(db.Float)
    total = db.Column(db.Float)
    bordeaux = db.Column(db.Integer)
    amazon = db.Column(db.String(255))
    bordeaux_euros = db.Column(db.Float)
    bordeaux_comm = db.Column(db.Float)
    amazon_euros = db.Column(db.Float)
    amazon_comm = db.Column(db.Float)
    PID = db.Column(db.Integer, db.ForeignKey("period.id"))
    date = db.Column(db.Date)
    description = db.Column(String(255))

    P_id = db.relationship("Period")

    def __repr__(self):
        return '{}'.format(self.id)

Мне нужно создать один запрос с двумя параметрами и фильтрами, чтобы я мог перебирать строки. Я следую этому уроку вложенных запросов , за которым следую, вот мой подзапрос

poste_eu = db.session.query(
    (Sale.id, Sale.poste, Sale.pays).filter(or_(Sale.pays=='United Kingdom', Sale.pays=='France', Sale.pays=='Germany',\
           Sale.pays=='The Netherlands', Sale.pays=='Italy', Sale.pays=='Slovakia', Sale.pays=='Ireland',\
           Sale.pays=='Malta', Sale.pays=='Belgium', Sale.pays=='Spain')).label('poste_eu')
    ).group_by(Sale.id.asc()).subquery()

Но в терминале это выдает следующую ошибку

>>> poste_monde = db.session.query(
  ...     (Sale.id, Sale.poste, Sale.pays).filter(~or_(Sale.pays=='United Kingdom', 
     Sale.pays=='France', Sale.pays=='Germany',\
  ...            Sale.pays=='The Netherlands', Sale.pays=='Italy', Sale.pays=='Slovakia', 
     Sale.pays=='Ireland',\
  ...            Sale.pays=='Malta', Sale.pays=='Belgium', 
    Sale.pays=='Spain')).label('poste_monde')
  ...     ).group_by(Sale.id.asc()).subquery()
  Traceback (most recent call last):
    File "<stdin>", line 2, in <module>
  AttributeError: 'tuple' object has no attribute 'filter' ""

этот же запрос написан так:

def poste_monde(pid, month):
    p_monde = Sale.query.with_entities(Sale.id, Sale.poste).filter(Sale.PID==pid, extract('month', Sale.date)==month,\
          ~or_(Sale.pays=='United Kingdom', Sale.pays=='France', Sale.pays=='Germany', Sale.pays=='The Netherlands',\
           Sale.pays=='Italy', Sale.pays=='Slovakia', Sale.pays=='Ireland', Sale.pays=='Malta', Sale.pays=='Belgium',\
           Sale.pays=='Spain', Sale.pays=='FR', Sale.pays=='GB')).all()
    return p_monde

Я посмотрел на этот вопрос и спрашиваю себя, не нужно ли мне настроить мои классы таким же образом с ленивыми отношениями.

в моем запросе будет девять подзапросов, как в приведенном примере, Paremeters - 'pid' и 'month', а фильтры - список стран

Мне нужна помощь, чтобы первый запрос работал так что я могу добавить остальное !!!? С наилучшими пожеланиями Пол

...