вызов хранимой процедуры на Python с помощью курсора

#python #amazon-web-services #stored-procedures #amazon-redshift

#python #amazon-web-services #хранимые процедуры #amazon-redshift

Вопрос:

Данные в redshift будут изменяться всякий раз, когда в базу данных добавляется новая схема таблицы. Я пытаюсь получить все имена table_schema в information_schema.tables.

Итак, я создал хранимую процедуру, которая возвращает отдельное имя table_schema, используя метод cursor. Теперь я хотел бы, чтобы она вызывалась в моем проекте с использованием Python.

Хранимая процедура:

 CREATE OR REPLACE PROCEDURE get_dist_schema(rsout INOUT refcursor)
AS $$
BEGIN 
  OPEN rsout FOR SELECT DISTINCT table_schema FROM information_schema.tables;
END;
$$ LANGUAGE plpgsql;

//this is used in the database to fetch all rows
BEGIN;
CALL get_dist_schema('sname');
FETCH ALL FROM sname;

commit;
  

python.py

 def call_dist_name(sname):
    conn = None

    try:
        params = config()
        conn = psycopg2.connect(**params)
        cur = conn.cursor()

        cur.execute('CALL get_dist_schema(%s)' % sname)

        conn.commit()
        result = cur.fetchall()
        for row in result:
                print(row[0])
        cur.close()



    except(Exception, psycopg2.DatabaseError) as error:
        print(error)

    finally:
        if conn is not None:
            conn.close()    


if __name__ == '__main__':
    call_dist_name('sname')
  

Ошибка: столбец «sname» не существует.

Как мне получить набор результатов отображения в хранимой процедуре в моем проекте?

Ответ №1:

Я думаю, проблема в том, что значение ( sname ), передаваемое хранимой процедуре, не указывается:

 cur.execute('CALL get_dist_schema(%s)' % sname)
  

При замене переменной это приведет к:

 cur.execute('CALL get_dist_schema(sname)')
  

в то время как это должно быть:

 cur.execute("CALL get_dist_schema('sname')")
  

Поэтому измените строку на:

 cur.execute("CALL get_dist_schema('%s')" % sname)