Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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
Bash 用于在文件中执行pgsql命令的Shell脚本_Bash_Postgresql_Psql - Fatal编程技术网

Bash 用于在文件中执行pgsql命令的Shell脚本

Bash 用于在文件中执行pgsql命令的Shell脚本,bash,postgresql,psql,Bash,Postgresql,Psql,我正在尝试自动化一组创建模板数据库的过程 我有一组文件(file1、file2、…fileN),每个文件都包含创建模板数据库所需的一组pgsql命令 文件(createdbtemplate1.sql)的内容大致如下所示: CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8'; \c mytemplate1 CREATE TABLE first_table ( --- fields here .. ); -- Add C language ex

我正在尝试自动化一组创建模板数据库的过程

我有一组文件(file1、file2、…fileN),每个文件都包含创建模板数据库所需的一组pgsql命令

文件(createdbtemplate1.sql)的内容大致如下所示:

CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8';

\c mytemplate1

CREATE TABLE first_table ( 
 --- fields here ..
);

-- Add C language extension + functions
\i db_funcs.sql
# run commands to create TEMPLATE db mytemplate1
# ./groksqlcommands.sh createdbtemplate1.sql

for dbname in foo foofoo foobar barbar
do
    # Need to simply create a database based on an existing template in this script
    psql CREATE DATABASE $dbname TEMPLATE mytemplate1
done
我希望能够编写一个shell脚本来执行文件中的命令,以便编写如下脚本:

CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8';

\c mytemplate1

CREATE TABLE first_table ( 
 --- fields here ..
);

-- Add C language extension + functions
\i db_funcs.sql
# run commands to create TEMPLATE db mytemplate1
# ./groksqlcommands.sh createdbtemplate1.sql

for dbname in foo foofoo foobar barbar
do
    # Need to simply create a database based on an existing template in this script
    psql CREATE DATABASE $dbname TEMPLATE mytemplate1
done
有什么建议吗?(正如你可能已经猜到的,我是一个shell脚本新手。)

编辑 为了进一步澄清这个问题,我想知道:

  • 如何编写groksqlcommands.sh(将从文件运行一组pgsql cmds的bash脚本)
  • 如何在命令行中基于现有模板创建数据库

  • 您可以
    echo
    将您的命令发送到psql输入:

    for dbname in foo foofoo foobar barbar
    do
        echo """
    CREATE DATABASE $dbname TEMPLATE mytemplate1
    """ | psql
    done
    

    如果你愿意多走一步,你可能会更成功。它将允许您使用python而不是bash构建脚本,bash更容易,并且具有更好的控制能力


    按照评论中的要求:

    首先,不要混用
    psql
    元命令和
    SQL
    命令。这些是独立的命令集。有一些技巧可以将它们结合起来(使用psql元命令
    \o
    \\
    并在shell中将字符串管道化到psql),但这很快就会让人困惑

    • 使文件仅包含SQL命令
    • 不要在SQL文件中包含
      CREATE DATABASE
      语句。单独创建数据库,您需要在同一个模板数据库中执行多个文件
    假设您作为操作系统用户
    postgres
    操作,并使用数据库角色
    postgres
    作为(默认)postgres超级用户,所有数据库都位于默认端口5432上的同一个DB集群中,由于默认设置为
    pg_hba.conf
    ,因此角色
    postgres
    具有较少密码的访问权限

    psql postgres -c "CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8'
                      TEMPLATE template0"
    
    我将新模板数据库基于默认系统模板数据库
    template0

    你的问题 如何从文件(…)运行一组pgsql cmds

    尝试:

    目录中文件批处理的脚本文件示例:

    #/垃圾箱/垃圾箱
    对于/path/to/files/*中的文件;做
    psql mytemplate1-f“$file”
    完成
    
    命令选项
    -f
    使
    psql
    在文件中执行SQL命令

    如何在命令行中基于现有模板创建数据库

    命令选项
    -c
    使
    psql
    执行单个SQL命令字符串。可以是多个命令,由
    终止-将在一个事务中执行,并且只返回最后一个命令的结果。
    了解


    如果未提供要连接的数据库,
    psql
    将连接到名为“postgres”的默认维护数据库。在第二个答案中,与我们连接到哪个数据库无关。

    将sql脚本存储在根目录下 使用dev、tst、prd参数化数据库 使用find运行所有pgsql脚本,如图所示 错误时退出


    或者只需git从

    克隆整个工具,就可以在需要的情况下使用它

    下面是我用来将JSON导入PostgreSQL(WSL Ubuntu)的脚本,它基本上要求在同一命令行中混合使用psql元命令和SQL。注意使用了有点晦涩的script命令,它分配了一个伪tty:

    $ more update.sh
    #!/bin/bash
    wget <filename>.json
    echo '\set content `cat $(ls -t <redacted>.json.* | head -1)` \\ delete from <rable>; insert into <table> values(:'"'content'); refresh materialized view <view>; " | PGPASSWORD=<passwd> psql -h <host> -U <user> -d <database>
    $ 
    
    $more update.sh
    #!/bin/bash
    wget.json
    echo'\set content`cat$(ls-t.json.*head-1)`\\delete from;插入值(:'“'content”);刷新物化视图;“| PGPASSWORD=psql-h-U-d
    $ 
    
    我想你的答案与我问题的第二部分有关(顺便说一句,psql不会像你写的那样提示输入用户名和密码吗?)。从上面看,不清楚如何执行文件中的单个命令(除非您建议读取文件中的行、迭代行并回显到psql?),回显中的内容与psql提示符中的正常输入中的内容相同,因此您可以使用命令执行整个文件,或者,您可以使用sed创建过滤器,然后将其输出传递给psql,如
    echo“create DATABASE uu dbname uuuu”| sed“s/u db_name/$variable_with_db_name/g”| psql
    。至于psql请求密码,这取决于您的PostgresSQL配置,但是如果您不想配置没有密码的用户,您仍然可以手动键入密码。嗯,您可能在那里找到了一些东西。事实上,我刚刚(今天!)开始使用sqlalchemy。。。但学习曲线陡峭,认为使用bash会更容易/更快。@HomunculusReticulli哦,使用bash绝对更容易。但是,任何有用的东西都会被重用,所有那些你告诉自己不会出现在一次性脚本中的边缘都会回来咬你。@HomunculusReticulli巧合的是,我创建了一些非常类似的东西,尽管DB是mssql实例,我还有一些其他要求。这花了我一个多月的时间,有些事情我希望我能做得有所不同。但最重要的是,我希望我用的是炼金术。如果您感兴趣,我可以将代码上传到github上,供您阅读。我同意bash方法虽然(表面上)现在更快,但可能在稍后阶段再次对我产生影响。我更喜欢sqlAlchemy方法——尤其是如果我有一个工作基础的话。这将是非常有帮助的,看看你以前做了什么。请将您的代码上传到github,这样我就可以看看它是否能给我一些关于使用sqlalchemy的想法。Thanks@HomunculusReticulli我已经添加了一个到github repo的链接。请注意,我是根据自己的需要建造的。因为它是sql和额外的命令,所以它有一些限制,就像所有迷你语言一样。也就是说,它适合我的问题集,而不是其他人的。你的问题模棱两可。弗斯特