python-循环获得pg库中所有自建视图、函数、过程:

import psycopg2
import shutil
import os
print("输出要连接的数据库:")
database=input()
print("输入用户名:")
user=input()
print("输入密码:")
passwd=input()
print("输入数据库连接地址:")
host=input()
print("输入端口号:")
port=input()
#创建连接对象
mydb=psycopg2.connect(
    database=database,
    user=user,
    password=passwd,
    host=host,
    port=port
)
#创建指针对象
mycur=mydb.cursor()
print("选择要保存文件的地址:")
path = input()
print("选择要保存的文件名:")
filename = input()
if os.path.exists(path + './' + filename):
    shutil.rmtree(path +'./' +filename,ignore_errors=True)
else:
    pass
os.mkdir(path + './' + filename)
print("选择要到导出的结构类型(视图、函数、过程):")
str=input()
if str=="视图":
    mycur.execute("select viewname from pg_catalog.pg_views where schemaname ='public' and viewowner ='{}'".format(user))
    view=mycur.fetchall()
    viewlen=len(view)
    j = 0
    while j < viewlen:
        a = (view[j])[0]
        mycur.execute("select ('create view '||viewname ||' as '||definition)as view_definition from pg_catalog.pg_views where schemaname ='public' and viewowner ='{}' and viewname='{}'".format(user,a))
        (myresult,) = mycur.fetchone()
        f = open(path + './' + filename + './' + a + '.sql', 'w', encoding='utf-8')
        f.write(myresult)
        f.close()
        j += 1
if str=="过程":
    mycur.execute("select a.routine_name from information_schema.routines a inner join information_schema.parameters b on a.specific_name =b.specific_name where a.specific_schema ='public' and a.routine_definition is not null and a.routine_type ='PROCEDURE' group by a.routine_name ")
    procedure=mycur.fetchall()
    procedurelen=len(procedure)
    j = 0
    while j<procedurelen:
        a = (procedure[j])[0]
        esql = r'''with q as (select b.specific_name ,a.routine_name ,(b.parameter_mode || ' ' || b.parameter_name || ' '|| b.data_type) as aa,a.routine_definition ,('CREATE OR REPLACE PROCEDURE public.'||a.routine_name || '(') as bb,(')LANGUAGE plpgsql AS $procedure$'||a.routine_definition|| '$procedure$;') as cc from information_schema.routines a inner join information_schema.parameters b on a.specific_name =b.specific_name where a.specific_schema ='public' and a.routine_definition is not null and a.routine_type ='PROCEDURE') select replace(replace((array_agg(distinct q.bb)::text||array_agg(distinct q.aa)::text||array_agg(distinct q.cc)::text),'{"',''),'"}','')from q where q.routine_name = '%s' group by q.routine_name;''' % a
        mycur.execute(esql)
        #mycur.execute("with q as (select b.specific_name ,a.routine_name ,(b.parameter_mode || ' ' || b.parameter_name || ' '|| b.data_type) as aa,a.routine_definition ,('CREATE OR REPLACE PROCEDURE public.'||a.routine_name || '(') as bb,(')LANGUAGE plpgsql AS $procedure$'||a.routine_definition|| '$procedure$;') as cc from information_schema.routines a inner join information_schema.parameters b on a.specific_name =b.specific_name where a.specific_schema ='public' and a.routine_definition is not null and a.routine_type ='PROCEDURE') select replace(replace((array_agg(distinct q.bb)::text||array_agg(distinct q.aa)::text||array_agg(distinct q.cc)::text),'{"',''),'"}','')from q where q.routine_name ='{}' group by q.routine_name".format(a))
        #mycur.execute("with q as (select b.specific_name ,a.routine_name ,(b.parameter_mode || ' ' || b.parameter_name || ' '|| b.data_type) as aa,a.routine_definition ,('CREATE OR REPLACE PROCEDURE public.'||a.routine_name || '(') as bb,(')LANGUAGE plpgsql AS $procedure$'||a.routine_definition|| '$procedure$;') as cc from information_schema.routines a inner join information_schema.parameters b on a.specific_name =b.specific_name where a.specific_schema ='public' and a.routine_definition is not null and a.routine_type ='PROCEDURE') select (array_agg(distinct q.bb)::text||array_agg(distinct q.aa)::text||array_agg(distinct q.cc)::text) from q where q.routine_name ='{}' group by q.routine_name".format(a))
        #mycur.execute("with q as (select b.specific_name ,a.routine_name ,(b.parameter_mode || ' ' || b.parameter_name || ' '|| b.data_type) as aa,a.routine_definition ,('CREATE OR REPLACE PROCEDURE public.'||a.routine_name || '(') as bb,(')LANGUAGE plpgsql AS $procedure$'||a.routine_definition|| '$procedure$;') as cc from information_schema.routines a inner join information_schema.parameters b on a.specific_name =b.specific_name where a.specific_schema ='public' and a.routine_definition is not null and a.routine_type ='PROCEDURE') select q.routine_name from q where q.routine_name ='{}' group by q.routine_name".format(a))
        (myresult,) = mycur.fetchone()
        f = open(path + './' + filename + './' + a + '.sql', 'w', encoding='utf-8')
        f.write(myresult)
        f.close()
        j += 1
if str=="函数":
    mycur.execute("select a.routine_name from information_schema.routines a inner join information_schema.parameters b on a.specific_name =b.specific_name where a.specific_schema ='public' and a.routine_definition is not null and a.routine_type ='FUNCTION' group by a.routine_name ")
    function=mycur.fetchall()
    functionlen=len(function)
    j = 0
    while j<functionlen:
        a = (function[j])[0]
        esql = r'''with q as (select b.specific_name ,a.routine_name ,(b.parameter_mode || ' ' || b.parameter_name || ' '|| b.data_type) as aa,a.routine_definition ,('CREATE OR REPLACE FUNCTION public.'||a.routine_name || '(')as bb,(')RETURNS '||a.type_udt_name || ' LANGUAGE plpgsql AS $function$' ||a.routine_definition || '$function$;') as cc from information_schema.routines a inner join information_schema.parameters b on a.specific_name =b.specific_name where a.specific_schema ='public' and a.routine_definition is not null and a.routine_type ='FUNCTION') select replace(replace(replace((array_agg(distinct q.bb)::text||array_agg(distinct q.aa)::text||array_agg(distinct q.cc)::text),'{"',''),'"}',''),'","',',')from q where q.routine_name = '%s' group by q.routine_name;''' % a
        mycur.execute(esql)
        (myresult,) = mycur.fetchone()
        f = open(path + './' + filename + './' + a + '.sql', 'w', encoding='utf-8')
        f.write(myresult)
        f.close()
        j += 1

运行pyinstaller -F ***.py将.py文件封装成.exe。

PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES,现在已经更名为PostgreSQL. PostgreSQL支持大部分SQL标准并且提供了许多其它现代特性:复杂查询、外键、触发器、视图、事务完整性等。PostgreSQL 是一个免费的对象-关系数据服务器(数据管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据系统(比如 MySQL 和 Firebird),和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一种选择。事实上, PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统(MVCC)、数据完整性检查等特性的唯一的一种自由软件的数据管理系统。 Inprise 的 InterBase 以及SAP等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。最后,PostgreSQL拥有一支非常活跃的开发队伍,而且在许多黑客的努力下,PostgreSQL 的质量日益提高。从技术角度来讲,PostgreSQL 采用的是比较经典的C/S(client/server)结构,也就是一个客户端对应一个服务器端守护进程的模式,这个守护进程分析客户端来的查询请求,生成规划树,进行数据检索并最终把结果格式化输出后返回给客户端。为了便于客户端的程序的编写,由数据服务器提供了统一的客户端 C 接口。而不同的客户端接口都是源自这个 C 接口,比如ODBC,JDBC,Python,Perl,Tcl,C/C++,ESQL等, 同时也要指出的是,PostgreSQL 对接口的支持也是非常丰富的,几乎支持所有类型的数据客户端接口。这一点也可以说是 PostgreSQL 一大优点。本课程作为PostgreSQL数据管理一,主要讲解以下内容: 1.     PostgreSQL 存储过程基本知识2.     PostgreSQL 用户自定义函数3.     PostgreSQL 控制结构4.     PostgreSQL 游标和存储过程5.     PostgreSQL 索引6.     PostgreSQL 视图7.     PostgreSQL 触发器8.     PostgreSQL 角色、备份和还原9.     PostgreSQL 表空间管理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值