Commit inside postgressql11 procedure throwing error when call from sqlalchemy engine











up vote
0
down vote

favorite












Postgres Version : 11



Procedure code:



CREATE OR REPLACE PROCEDURE public.prc_insert_proc(table_name character varying)
LANGUAGE plpgsql
AS $procedure$ declare StartTime timestamptz;

EndTime timestamptz;

Delta double precision;
err_context text;
tab_partition RECORD;
v_tab_partition varchar;
begin

for tab_partition in (SELECT
child.relname AS child
FROM pg_inherits
JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
JOIN pg_class child ON pg_inherits.inhrelid = child.oid
JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace
JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace
WHERE parent.relname=table_name) loop
v_tab_partition = tab_partition.child;
begin
execute 'insert
into
test_tab (id,
report_date,
effective_asof_date,
effective_until_date,
active_flag) select id,
to_date(report_date,''YYMMDD'') report_date,
now(),
''31-Dec-2200'',
''Y''
from '||
tab_partition.child ||' on
conflict (id) do update set report_date=excluded.report_date;';
commit;
end;

end loop;



exception
when others then
GET STACKED DIAGNOSTICS err_context = PG_EXCEPTION_CONTEXT;
RAISE INFO 'Error Name:%',SQLERRM;
RAISE INFO 'Error State:%', SQLSTATE;
RAISE INFO 'Error Context:%', err_context;

end;

$procedure$;


I am calling above procedure by creating sqlalchemy engine and then calling this procedure.



def load_test(session, table, log):  # pragma: no cover
try:
sql = "call prc_insert_proc('" +
table + "');"
session.execute(text(sql).execution_options(autocommit=False))
session.commit()
except ErrorBase as e:
log.error(f"{str(e)}")
raise


It is throwing up following error. Session was created using sessionmaker and create_engine.



engine = create_engine(config.connection_string, echo=False)
Session = sessionmaker()
Session.configure(bind=engine)
session = Session()



invalid transaction termination




I am pretty new to both sqlalchemy and PostgreSQL.Each partition of the table has about a million record and I want to commit after every insert. Other option would be get the list of partition in the python script and add partition name parameter in procedure. Loop through the procedure in python and commit after every call. However, when I read that in PostgreSQL 11 we can commit inside the procedure than I thought of using that.










share|improve this question


























    up vote
    0
    down vote

    favorite












    Postgres Version : 11



    Procedure code:



    CREATE OR REPLACE PROCEDURE public.prc_insert_proc(table_name character varying)
    LANGUAGE plpgsql
    AS $procedure$ declare StartTime timestamptz;

    EndTime timestamptz;

    Delta double precision;
    err_context text;
    tab_partition RECORD;
    v_tab_partition varchar;
    begin

    for tab_partition in (SELECT
    child.relname AS child
    FROM pg_inherits
    JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
    JOIN pg_class child ON pg_inherits.inhrelid = child.oid
    JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace
    JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace
    WHERE parent.relname=table_name) loop
    v_tab_partition = tab_partition.child;
    begin
    execute 'insert
    into
    test_tab (id,
    report_date,
    effective_asof_date,
    effective_until_date,
    active_flag) select id,
    to_date(report_date,''YYMMDD'') report_date,
    now(),
    ''31-Dec-2200'',
    ''Y''
    from '||
    tab_partition.child ||' on
    conflict (id) do update set report_date=excluded.report_date;';
    commit;
    end;

    end loop;



    exception
    when others then
    GET STACKED DIAGNOSTICS err_context = PG_EXCEPTION_CONTEXT;
    RAISE INFO 'Error Name:%',SQLERRM;
    RAISE INFO 'Error State:%', SQLSTATE;
    RAISE INFO 'Error Context:%', err_context;

    end;

    $procedure$;


    I am calling above procedure by creating sqlalchemy engine and then calling this procedure.



    def load_test(session, table, log):  # pragma: no cover
    try:
    sql = "call prc_insert_proc('" +
    table + "');"
    session.execute(text(sql).execution_options(autocommit=False))
    session.commit()
    except ErrorBase as e:
    log.error(f"{str(e)}")
    raise


    It is throwing up following error. Session was created using sessionmaker and create_engine.



    engine = create_engine(config.connection_string, echo=False)
    Session = sessionmaker()
    Session.configure(bind=engine)
    session = Session()



    invalid transaction termination




    I am pretty new to both sqlalchemy and PostgreSQL.Each partition of the table has about a million record and I want to commit after every insert. Other option would be get the list of partition in the python script and add partition name parameter in procedure. Loop through the procedure in python and commit after every call. However, when I read that in PostgreSQL 11 we can commit inside the procedure than I thought of using that.










    share|improve this question
























      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











      Postgres Version : 11



      Procedure code:



      CREATE OR REPLACE PROCEDURE public.prc_insert_proc(table_name character varying)
      LANGUAGE plpgsql
      AS $procedure$ declare StartTime timestamptz;

      EndTime timestamptz;

      Delta double precision;
      err_context text;
      tab_partition RECORD;
      v_tab_partition varchar;
      begin

      for tab_partition in (SELECT
      child.relname AS child
      FROM pg_inherits
      JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
      JOIN pg_class child ON pg_inherits.inhrelid = child.oid
      JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace
      JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace
      WHERE parent.relname=table_name) loop
      v_tab_partition = tab_partition.child;
      begin
      execute 'insert
      into
      test_tab (id,
      report_date,
      effective_asof_date,
      effective_until_date,
      active_flag) select id,
      to_date(report_date,''YYMMDD'') report_date,
      now(),
      ''31-Dec-2200'',
      ''Y''
      from '||
      tab_partition.child ||' on
      conflict (id) do update set report_date=excluded.report_date;';
      commit;
      end;

      end loop;



      exception
      when others then
      GET STACKED DIAGNOSTICS err_context = PG_EXCEPTION_CONTEXT;
      RAISE INFO 'Error Name:%',SQLERRM;
      RAISE INFO 'Error State:%', SQLSTATE;
      RAISE INFO 'Error Context:%', err_context;

      end;

      $procedure$;


      I am calling above procedure by creating sqlalchemy engine and then calling this procedure.



      def load_test(session, table, log):  # pragma: no cover
      try:
      sql = "call prc_insert_proc('" +
      table + "');"
      session.execute(text(sql).execution_options(autocommit=False))
      session.commit()
      except ErrorBase as e:
      log.error(f"{str(e)}")
      raise


      It is throwing up following error. Session was created using sessionmaker and create_engine.



      engine = create_engine(config.connection_string, echo=False)
      Session = sessionmaker()
      Session.configure(bind=engine)
      session = Session()



      invalid transaction termination




      I am pretty new to both sqlalchemy and PostgreSQL.Each partition of the table has about a million record and I want to commit after every insert. Other option would be get the list of partition in the python script and add partition name parameter in procedure. Loop through the procedure in python and commit after every call. However, when I read that in PostgreSQL 11 we can commit inside the procedure than I thought of using that.










      share|improve this question













      Postgres Version : 11



      Procedure code:



      CREATE OR REPLACE PROCEDURE public.prc_insert_proc(table_name character varying)
      LANGUAGE plpgsql
      AS $procedure$ declare StartTime timestamptz;

      EndTime timestamptz;

      Delta double precision;
      err_context text;
      tab_partition RECORD;
      v_tab_partition varchar;
      begin

      for tab_partition in (SELECT
      child.relname AS child
      FROM pg_inherits
      JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
      JOIN pg_class child ON pg_inherits.inhrelid = child.oid
      JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace
      JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace
      WHERE parent.relname=table_name) loop
      v_tab_partition = tab_partition.child;
      begin
      execute 'insert
      into
      test_tab (id,
      report_date,
      effective_asof_date,
      effective_until_date,
      active_flag) select id,
      to_date(report_date,''YYMMDD'') report_date,
      now(),
      ''31-Dec-2200'',
      ''Y''
      from '||
      tab_partition.child ||' on
      conflict (id) do update set report_date=excluded.report_date;';
      commit;
      end;

      end loop;



      exception
      when others then
      GET STACKED DIAGNOSTICS err_context = PG_EXCEPTION_CONTEXT;
      RAISE INFO 'Error Name:%',SQLERRM;
      RAISE INFO 'Error State:%', SQLSTATE;
      RAISE INFO 'Error Context:%', err_context;

      end;

      $procedure$;


      I am calling above procedure by creating sqlalchemy engine and then calling this procedure.



      def load_test(session, table, log):  # pragma: no cover
      try:
      sql = "call prc_insert_proc('" +
      table + "');"
      session.execute(text(sql).execution_options(autocommit=False))
      session.commit()
      except ErrorBase as e:
      log.error(f"{str(e)}")
      raise


      It is throwing up following error. Session was created using sessionmaker and create_engine.



      engine = create_engine(config.connection_string, echo=False)
      Session = sessionmaker()
      Session.configure(bind=engine)
      session = Session()



      invalid transaction termination




      I am pretty new to both sqlalchemy and PostgreSQL.Each partition of the table has about a million record and I want to commit after every insert. Other option would be get the list of partition in the python script and add partition name parameter in procedure. Loop through the procedure in python and commit after every call. However, when I read that in PostgreSQL 11 we can commit inside the procedure than I thought of using that.







      python postgresql sqlalchemy postgresql-11






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 21 at 17:47









      Raj

      297




      297





























          active

          oldest

          votes











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53417864%2fcommit-inside-postgressql11-procedure-throwing-error-when-call-from-sqlalchemy-e%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown






























          active

          oldest

          votes













          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes
















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53417864%2fcommit-inside-postgressql11-procedure-throwing-error-when-call-from-sqlalchemy-e%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Berounka

          Sphinx de Gizeh

          Different font size/position of beamer's navigation symbols template's content depending on regular/plain...