Вторая вставка не работает, но первая и третья - PullRequest
1 голос
/ 15 октября 2019

У меня три оператора EXECUTE, выполняющиеся с использованием psycopg2. Первый INSERT видим после обновлений, а третий INSERT видим, но второй INSERT не происходит.

OpenERP дает моей функции открытый курсор, который я использую для всех трех операторов;OpenERP затем фиксирует после того, как моя функция возвращается. Я пытался поймать любые исключения (их нет), я пытался использовать отладочные отпечатки, чтобы найти подсказки (нет) - есть идеи? Ниже приведены утверждения.

работает:

    cr.execute("""\
        INSERT INTO ir_act_report_xml
            (
              id, header, report_type, type, model, name, report_name,
              create_uid, create_date, write_uid, write_date,
              auto, multi, attachment_use
               )
        VALUES
            (
              %s, 't', 'pdf', 'ir.actions.report.xml', '%s', '%s', '%s',
              1, now() AT TIME ZONE 'UTC', 1, now() AT TIME ZONE 'UTC',
              false, false, false
              )
            """
            % (action_id, model_name, title_name, report_xml_id)
              )

не работает, ошибок не дано

    cr.execute("""\
        INSERT INTO ir_model_data
            (
            module, name, model, res_id, date_init, date_update,
            create_uid, create_date, write_uid, write_date,
            noupdate
            )
        VALUES
            (
              '%s', '%s', '%s', %s, now() AT TIME ZONE 'UTC', now() AT TIME ZONE 'UTC',
              1, now() AT TIME ZONE 'UTC', 1, now() AT TIME ZONE 'UTC',
              false
              )
            """
            % (module, imd_xml_id, model_name, action_id)
            )

работает:

    cr.execute("""\
        INSERT INTO ir_values
            (
              id, key, key2, value, model, name, res_id,
              create_uid, create_date, write_uid, write_date
              )
        VALUES
            (
              %s, 'action', 'client_print_multi', 'ir.actions.report.xml,%s', '%s', '%s', 0,
              1, now() AT TIME ZONE 'UTC', 1, now() AT TIME ZONE 'UTC'
              )
            """
            % (iv_id, action_id, model_name, title_name),
            )

Всетри обрабатываются последовательно без промежуточных фиксаций или отката.

1 Ответ

1 голос
/ 15 октября 2019

Чтобы отследить подобные проблемы, проверьте, что на самом деле происходит с базой данных.

Установите log_min_duration_statement на 0 перед выполнением операторов SQL и проверьте файл журнала PostgreSQL впоследствии. Затем вы знаете, какие операторы действительно выполнялись.

Возможные объяснения такого поведения:

  • Три INSERT s выполняются в разных сеансах базы данных.

  • Оператор с ошибками даже не попадает в базу данных, и исключение перехватывается в Python.

  • Управление транзакциями отличается от того, что вы делаетедумаю, и одно утверждение откатывается.

...