Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql:如何将表导出到单独的csv文件中_Sql_Postgresql_Csv - Fatal编程技术网

Postgresql:如何将表导出到单独的csv文件中

Postgresql:如何将表导出到单独的csv文件中,sql,postgresql,csv,Sql,Postgresql,Csv,我想将整个数据库导出到aws S3,以便稍后导入到BI工具中。我需要将每个数据库表导出到它自己的csv文件中。但是我不想手工做或者做一些脚本。有没有一种简单的方法可以通过Postgresql实现这一点?通过此查询,您可以列出模式public中的所有表: select table_schema, table_name from information_schema.tables where table_type = 'BASE TABLE' and table_schema = 'public'

我想将整个数据库导出到aws S3,以便稍后导入到BI工具中。我需要将每个数据库表导出到它自己的csv文件中。但是我不想手工做或者做一些脚本。有没有一种简单的方法可以通过Postgresql实现这一点?

通过此查询,您可以列出模式
public
中的所有表:

select table_schema, table_name 
from information_schema.tables
where table_type = 'BASE TABLE'
and table_schema = 'public';
您可以在函数中使用查询,该函数将为每个表名执行相应的
copy
命令:

create or replace function copy_my_tables ()
returns void language plpgsql as $$
declare
    r record;
begin
    for r in
        select table_schema, table_name 
        from information_schema.tables
        where table_type = 'BASE TABLE'
        and table_schema = 'public'
    loop
        execute format ('copy %s.%s to ''c:\data\%s_%s.csv'' (format csv)',
            r.table_schema, r.table_name, r.table_schema, r.table_name);
    end loop;
end $$;

select copy_my_tables();

我们可以从bash脚本中以单独的csv格式导出所有表,并在模式中使用标题

#set -x
read -p "Please provide Schema name   " Schema
if [ -z $Schema ]
then
    echo "No Schema name provided set default schema public."
Schema=public
fi
read -p "Please provide Database name  " Db
if [ -z $Db ]
then
    echo "No Database name provided set default database postgres."
Db=postges
fi
read -p "Please provide Postgres Role/User name  " User
if [ -z $User ]
then
    echo "No User/Role name provided set default User?Role postgres."
User=postgres
fi

echo " Schema Name is-->$Schema   Database Name--> $Db   User Name-->$User "

psql -U $User -h localhost -Atc "select tablename from pg_tables where schemaname='$Schema'" $Db |\
  while read TABLENAME; do
        echo "$TABLENAME"
    psql -U $User -h localhost -c "COPY $Schema.$TABLENAME TO STDOUT WITH CSV HEADER" $Db  > $TABLENAME.csv
  done
在上面提到的脚本中,您必须提供 模式 数据库和 用户/角色
如果需要提供端口和主机名,则可以使用-p和-h选项

Plus 1。我还可以将列名插入csv吗?@MAK-是,在
copy
命令中添加
标题作为选项,即
copy。。。(格式化csv,标题)
。嘿,是的!我得到了它。非常感谢你。