【问题标题】:How to use variable in sql query odoo如何在sql查询odoo中使用变量
【发布时间】:2020-09-09 11:04:32
【问题描述】:

我想在 sql 查询中添加 branch_id 变量。我该如何使用?当我使用下面的代码时,我得到了 psycopg2.ProgrammingError: column reference "branch_id" is ambiguous.

        branch_id = self.env.user.branch_id.id
        query = '''
            SELECT DISTINCT l.partner_id, res_partner.name AS name, UPPER(res_partner.name) AS UPNAME, CASE WHEN prop.value_text IS NULL THEN 'normal' ELSE prop.value_text END AS trust
            FROM account_move_line AS l
              LEFT JOIN res_partner ON l.partner_id = res_partner.id
              LEFT JOIN ir_property prop ON (prop.res_id = 'res.partner,'||res_partner.id AND prop.name='trust' AND prop.company_id=%s),
              account_account, account_move am
            WHERE (l.account_id = account_account.id)
                AND (l.move_id = am.id)
                AND (am.state IN %s)
                AND (account_account.internal_type IN %s)
                AND (
                        l.reconciled IS NOT TRUE
                        OR l.id IN(
                            SELECT credit_move_id FROM account_partial_reconcile where max_date > %s
                            UNION ALL
                            SELECT debit_move_id FROM account_partial_reconcile where max_date > %s
                        )
                    )
                    ''' + partner_clause + '''
                AND (l.date <= %s)
                AND (l.branch_id = branch_id)
                AND l.company_id IN %s
            ORDER BY UPPER(res_partner.name)'''
        arg_list = (self.env.company.id,) + arg_list
        cr.execute(query, arg_list)

【问题讨论】:

  • 轻松为您提供帮助 - 简化问题。 (minimal reproducible example.)
  • (l.branch_id = branch_id) 这里 branch_id 不被视为参数,而是作为数据库列(即不合格,这会导致问题)。您必须将branch_id 添加到arg_list(按正确顺序)并在查询中将其标记为带有% 符号的参数
  • arg_list =(branch_id)+ (self.env.company.id,) + arg_list。它会起作用吗?它是正确的吗?@MarmiteBomber

标签: python sql postgresql odoo


【解决方案1】:

我更喜欢使用名称进行查询的变量替换,这样更容易理解。例如:

    branch_id = self.env.user.branch_id.id
    query = '''
        SELECT DISTINCT l.partner_id, res_partner.name AS name, UPPER(res_partner.name) AS UPNAME, CASE WHEN prop.value_text IS NULL THEN 'normal' ELSE prop.value_text END AS trust
        FROM account_move_line AS l
          LEFT JOIN res_partner ON l.partner_id = res_partner.id
          LEFT JOIN ir_property prop ON (prop.res_id = 'res.partner,'||res_partner.id AND prop.name='trust' AND prop.company_id=%(company_id)s),
          account_account, account_move am
        WHERE (l.account_id = account_account.id)
            AND (l.move_id = am.id)
            AND (am.state IN %(state)s)
            AND (account_account.internal_type IN %(internal_types)s
            AND (
                    l.reconciled IS NOT TRUE
                    OR l.id IN(
                        SELECT credit_move_id FROM account_partial_reconcile where max_date > %(max_date)s
                        UNION ALL
                        SELECT debit_move_id FROM account_partial_reconcile where max_date > %(max_date)s
                    )
                )
                ''' + partner_clause + '''
            AND (l.date <= %(date)s)
            AND (l.branch_id = %(branch_id)s)
            AND l.company_id IN %(company_id)s
        ORDER BY UPPER(res_partner.name)'''
    args = {
        'company_id': ...,
        'internal_types': ...,
        'max_date': ...,
        'date': ...,
        'branch_id': ...,
    }
    cr.execute(query, args)
    

【讨论】:

    猜你喜欢
    • 2021-03-09
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 2019-08-18
    相关资源
    最近更新 更多