【问题标题】:How do I use SQL commands inside SH script如何在 SH 脚本中使用 SQL 命令
【发布时间】:2012-10-16 05:27:37
【问题描述】:

我当前的脚本如下所示:

!/bin/sh 
sudo -u postgres createdb mydb
sudo -u postgres psql mydb
CREATE TABLE person (first VARCHAR(32), last VARCHAR(32));
CREATE TABLE thing (size VARCHAR(32), price VARCHAR(32));
exit 0;

截至目前,当我执行脚本时,它会创建数据库并将我登录到其中。但是,在将我登录到 mydb 后,脚本不会继续执行 CREATE TABLE 命令。

我是新手,所以我不知道我是否以正确的方式处理这件事。基本上我只想要一个创建数据库的脚本,然后在其中创建几个表(使用 PostgreSQL)。

【问题讨论】:

标签: database postgresql sh


【解决方案1】:

一种方法是使用here-doc(这是一个shell 功能,取决于您运行的shell):

psql mydb <<EOF
    CREATE TABLE person (first VARCHAR(32), last VARCHAR(32));
    CREATE TABLE thing (size VARCHAR(32), price VARCHAR(32));
EOF

另一种方法是将命令写入受充分保护(具有权限)的临时文件,然后使用 -f FILENAME 选项将其作为脚本传递给 postgres

【讨论】:

  • 请注意,您可以在此处的文档中使用 $variable 替换,将 shell 变量替换到 SQL 中。如果您不想这样做,您通常应该引用此处的文档以防止替换,例如&lt;&lt;'__EOF__' 而不是&lt;&lt;__EOF__。当您在 SQL 中使用 $1 或美元引用而不引用您的 here-documents 时,会出现意想不到的令人兴奋的结果。
【解决方案2】:
#!/bin/bash

psql -d mydb -U postgres -c "CREATE TABLE person (first VARCHAR(32), last VARCHAR(32));"
psql -d mydb -U postgres -c "CREATE TABLE thing (size VARCHAR(32), price VARCHAR(32));"

您可以使用 -c 选项运行所有查询。

【讨论】:

  • 嘿,非常感谢你,这就是我最终使用的方法。
【解决方案3】:

在将 hba_conf 文件编辑为“本地所有 postgres 信任”后(我使用了信任,因此我不必为我的脚本提供密码),我使用了 TraviJuu 的建议,现在我的脚本可以完美运行。这是最终结果的样子。

!/bin/sh

sudo -u postgres createdb mydb

psql -w -d mydb -U postgres -c "CREATE TABLE person (first VARCHAR(32), last VARCHAR(32));"

psql -w -d mydb -U postgres -c "CREATE TABLE thing (size VARCHAR(32), price VARCHAR(32));"

退出0;

【讨论】:

    猜你喜欢
    • 2016-05-19
    • 1970-01-01
    • 2013-09-26
    • 2017-08-02
    • 1970-01-01
    • 2020-03-16
    • 2013-09-17
    • 2023-03-02
    • 1970-01-01
    相关资源
    最近更新 更多