Как вставить значения в таблицу postgresql с помощью функции python и Psycopg? - PullRequest
0 голосов
/ 12 января 2020

У меня есть функция postgresql для вставки значений, которые отлично работают в psql

CREATE FUNCTION new_msg(p1 type, p2 type)
 RETURNS type AS
BEGIN
 -- some logic
INSERT INTO table(col1, col2) values (p1,p2);
return value;
END;
LANGUAGE language_name;

A python, например ...

import psycopg2
from config import config
def new_msg(ref_p1, ref_p2):
   # Configuracion
    params = config()
    conn = psycopg2.connect(**params)
    cur = conn.cursor()
    cur.execute("select * from new_msg(%s,%s);",(ref_p1, ref_p1,))

Но когда функции вызываются в python

new_msg(some_p1,some_p2)

, значения не вставляются в соответствующую таблицу и ошибка не генерируется. Я также пытался callpro c метод из Psycopg2 не работает. Любое предложение? спасибо.

1 Ответ

0 голосов
/ 13 января 2020

Добро пожаловать в StackOverflow!

Вам необходимо зафиксировать свои изменения. Вы можете попробовать добавить cur.commit () после вашего кода, чтобы делать это каждый раз, когда вы пишете в БД, или вы можете попробовать использовать контекстный менеджер для обработки всего этого.

Создайте файл с именем mydb.py

import psycopg2
import psycopg2.pool
from contextlib import contextmanager

dbpool = psycopg2.pool.ThreadedConnectionPool(host=<<YourHost>>,
                                              port=<<YourPort>>,
                                              dbname=<<YourDB>>,
                                              user=<<YourUser>>,
                                              password=<<YourPassword>>,
                                              )

@contextmanager
def db_cursor():
    conn = dbpool.getconn()
    try:
        with conn.cursor() as cur:
            yield cur
            conn.commit()
    except:
        conn.rollback()
        raise
    finally:
        dbpool.putconn(conn)

Тогда ваш код может использовать:

import mydb

def new_msg(ref_p1, ref_p2):
    with mydb.db_cursor as cur:
    cur.execute("""
                   select * from new_msg(%(ref_p1)s,%(ref_p2)s)
                """, {
                      'ref_p1': ref_p1,
                      'ref_p2': ref_p2,
                      }
               )

    return
...