【问题标题】:create database using psql in shell script takes username as db name在 shell 脚本中使用 psql 创建数据库将用户名作为数据库名称
【发布时间】:2020-01-19 21:23:54
【问题描述】:

以下是我用来在 shell 脚本中创建数据库的命令

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" \
            -c "CREATE DATABASE $database;"

报错

FATAL:  database "POSTGRES_USER" does not exist

如果我打印 $database 和 $POSTGRES_USER 它们会显示正确的值,但是当此命令出于某种原因运行时,用户名会作为数据库名称传递。

任何线索我可能会错过什么?

======

function create_db() {
    local database=$1
    local query_databases="select datname from pg_database;"
    local databases=$(echo "$query_databases" | psql -Aqt)
//this do not return any database but I have one db
    database_exist=$(containsElement "$databases" "$database")
    echo $database_exist;

    if [[ "$database_exist" == 1 ]]; then
        echo "Database '$database' exists. Skipping."
    else
        echo "Create Database '$database'"
        psql -v ON_ERROR_STOP=1 --username=$POSTGRES_USER \
             -c "CREATE DATABASE $database;"
    fi

}

参考来自 - https://github.com/mrts/docker-postgresql-multiple-databases/pull/10/files

【问题讨论】:

  • 这是默认设置。如果你不提供数据库名,postgres 使用用户名作为数据库名。所以:你应该在命令行上提供一个数据库名称。 (postgres,或template1)
  • @wildplasser 我应该提供不存在的数据库的名称吗?
  • 您应该提供一个确实存在的数据库名称。 (postgrestemplate1(几乎)一直存在)
  • 解决问题。

标签: sql postgresql shell psql


【解决方案1】:

您需要删除命令中的"

psql -v ON_ERROR_STOP=1 --username $POSTGRES_USER -c "CREATE DATABASE $database;"

【讨论】:

  • 我仍然遇到同样的错误,我已经更新了问题中的函数定义。
【解决方案2】:

您没有正确使用psql terminal。当使用选项的长形式时,您需要在选项和它的值之间添加= 符号。也不需要双引号。

考虑:

psql -v ON_ERROR_STOP=1 --username=$POSTGRES_USER \
        -c "CREATE DATABASE $database;"

【讨论】:

  • 我仍然遇到同样的错误,我已经更新了问题中的函数定义。
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多