Проблемы с group_by SqlAlchemy - PullRequest
       2

Проблемы с group_by SqlAlchemy

0 голосов
/ 20 декабря 2018

У меня проблема с SqlAlchemy и предложением group_by.См. Запрос SqlAlchemy ниже.

У меня есть запрос SqlAlchemy, который включает предложение group_by и вызывает исключение: '(cx_Oracle.DatabaseError) ORA-00979: не выражение GROUP BY'.Однако, когда я получаю SQL, сгенерированный запросом SqlAlachemy, и запускаю его вручную, запрос работает нормально.

Я не уверен, как выяснить, что не так с предложением group_by.У кого-нибудь есть какие-либо указания, идеи, предложения о том, как я могу приступить к отладке этой проблемы и выяснить, что я могу сделать, чтобы решить эту проблему?

Заранее спасибо, Даг

# create shorthand aliases
b = db.aliased(Batch)
bs = db.aliased(BatchingStatus)
bp = db.aliased(BatchPress)
bst = db.aliased(BatchState)
bit = db.aliased(BatchItem)
bin = db.aliased(BatchInput)
bpri = db.aliased(BatchPriority)
lcu = db.aliased(LCUser)
s = db.aliased(SubBatch)
w = db.aliased(WorkType)
ptw = db.aliased(LCProductToWorkType)
ctp = db.aliased(LCCategoryToProduct)
c = db.aliased(LCCategory)

# for correlated subquery
subq = (
    db.session.query(ctp.product_name)
        .join(c, c.category_id == ctp.category_id)
        .filter(func.lower(c.category_path) == category)
        .filter(ctp.active == 1)
)
# start of problem query
q = db.session.query(
    b.batch_signature.label('batch_signature'),
    b.batch_num,
    b.created_date.label('created_date'),
    bst.code.label('batch_state'),
    func.min(bin.promise_date).label('due_out'),
    bs.job_status,
    bp.press_id.label('press_id'),
    bp.description.label('press_description'),
    bp.code.label('press_code'),
    bp.active.label('press_active'),
    func.listagg(bin.item_id, ',').within_group(bin.item_id).label('subbatches'),
    bs.item_count.label('item_count'),
    bs.product.label('product'),
    bpri.code.label('priority'),
    ptw.display_format.label('product_display_format'),
    c.display_name.label('category_display_name'),
    lcu.coalesce_first_name,
    lcu.coalesce_last_name,
    lcu.coalesce_email,
) \
    .join(bs, (bs.batch_signature == b.batch_signature) & (bs.press_id == b.press_id)) \
    .join(bp, bp.press_id == b.press_id) \
    .join(bst, bst.state_id == b.state_id) \
    .join(bit, bit.batch_id == b.batch_id) \
    .join(bin, bin.batch_input_id == bit.batch_input_id) \
    .join(bpri, bpri.priority_id == bin.priority_id) \
    .join(lcu, lcu.username == bs.actor) \
    .join(s, s.subbatchno == func.to_char(bin.item_id)) \
    .join(w, w.worktypeenum == s.worktypeenum) \
    .join(ptw, ptw.worktypeenum == w.worktypeenum) \
    .join(ctp, ctp.category_to_product_id == ptw.category_to_product_id) \
    .join(c, c.category_id == ctp.category_id) \
    .filter(bs.product.in_(subq)) \
    .filter(b.state_id <= 200) \
    .group_by(
        b.batch_signature,
        b.batch_num,
        b.created_date,
        bst.code,
        bs.job_status,
        bp.press_id,
        bp.description,
        bp.code,
        bp.active,
        bs.item_count,
        bs.product,
        bpri.code,
        ptw.display_format,
        c.display_name,
        lcu.coalesce_first_name,
        lcu.coalesce_last_name,
        lcu.coalesce_email,
    ) \
    .order_by('batch_signature', 'batch_num', 'created_date')
try:
    retval = q.all()
except Exception as e:
    print e

Выше не показаны модели, некоторые из которых имеют методы @hybrid_property / @. Expression, такие как столбцы lcu.coalesce_first_name, которые являются попыткой скрыть код @ func.coalesce, который, как я думал, вызывал проблемы group_by.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...