#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)