使用游标在python中调用存储过程
Posted
技术标签:
【中文标题】使用游标在python中调用存储过程【英文标题】:call stored procedure in python using cursor 【发布时间】:2020-09-17 01:57:21 【问题描述】:只要在数据库中添加了新的表模式,redshift 中的数据就会发生变化。我正在尝试获取 information_schema.tables 中的所有 table_schema 名称。
所以我创建了一个使用游标方法返回不同 table_schema 名称的存储过程。现在我希望它使用 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)
【讨论】:
以上是关于使用游标在python中调用存储过程的主要内容,如果未能解决你的问题,请参考以下文章