当前位置: 首页 > 知识库问答 >
问题:

postgres中的“如果不存在则创建数据库”

端木桐
2023-03-14

我是postgreSQL的新手,我正在尝试创建一个模式文件,其中包含创建数据库和所需表所需的所有脚本。我过去为SQl服务器执行此操作的方式是检查数据库是否存在,然后运行必要的脚本。

postgreSQL中的以下脚本引发了一个错误:“无法从函数或多命令字符串执行创建数据库”

do $$
begin
If not exists (select 1 from pg_database where datname = 'TestDB')
Then
 CREATE DATABASE "TestDB";
end if;
end
$$

我通过导出数据库的备份创建了一个postgres数据库转储文件,但其中包含,

Drop Database "TestDB"

Create Database "TestDB"

这意味着每次运行模式文件时,数据库都会被删除并重新创建,如果数据库中存在数据,则会出现问题。

我如何检查postgreSQL中是否存在该数据库,而不必每次运行该文件时都删除该数据库并重新创建它?

提前感谢

共有1个答案

缪修德
2023-03-14

对于shell脚本,如果数据库不存在,则创建该数据库,否则只保留原样:

psql -U postgres -tc "SELECT 1 FROM pg_database WHERE datname = 'my_db'" | grep -q 1 || psql -U postgres -c "CREATE DATABASE my_db"

我发现这在devops配置脚本中很有帮助,您可能希望在同一个实例上运行多次。

对于那些想要得到解释的人:

-c = run command in database session, command is given in string
-t = skip header and footer
-q = silent mode for grep 
|| = logical OR, if grep fails to find match run the subsequent command

回答此问题中的credit andreasl。

 类似资料:
  • 问题内容: 有创建数据库的类似物吗? 背景:我正在编写一个脚本,以在未知系统上的PostgreSQL中自动设置架构。我不确定数据库(甚至是架构的一部分)是否已经部署,因此如果某些结构已经存在,我想构建代码以使其不会失败(或者理想情况下甚至显示错误)。我想区分导致我无法创建数据库的错误(因此中止将来的架构更改,因为它们将无法工作)。 问题答案: 否,但是您可以查询pg_catalog.pg_data

  • 问题内容: 我很沮丧,我不知道该怎么做。 基本上,我只想创建一个表,但是如果它存在,则需要将其删除并重新创建,而不是将其截断,但是如果不存在,则可以创建它。 有人可以帮忙吗? 谢谢乔治 问题答案: 放在tablename您的发言之前。 该语句将删除该表(如果存在),但如果不存在则不会引发错误。

  • 是否有用于创建数据库的模拟? 背景:我正在编写一个脚本来在未知系统上自动设置PostgreSQL中的模式。我不确定数据库(甚至是模式的一部分)是否已经部署,所以如果某些结构已经存在,我想将我的代码结构为不会失败(或者理想情况下甚至显示错误)。我想将阻止我创建数据库的错误(因此中止未来的模式更改,因为它们不起作用)与此错误区分开来。

  • 问题内容: 我正在使用PostgreSQL,并且是SQL的初学者。我正在尝试从查询创建表,并且如果运行: 它工作正常。但是然后如果我添加“如果不存在”并运行: 使用完全相同的查询,我得到: 有什么办法吗? 问题答案: CREATE TABLE AS被认为是与普通CREATE TABLE 分开的语句,并且 直到Postgres版本9.5 (请参阅changelog条目)不支持子句 为止 。(请务必查

  • 问题内容: 创建新表时遇到一些问题。当我使用CREATE TABLE命令时,我的新表将按应有的形式出现,但是当我退出活动时,应用程序崩溃,并且在logcat中得到了一个表已经存在的信息。如果我使用CREATE TABLE IF NOT EXISTS不存在,则不会形成新表,而只是将新的数据行添加到上一个表中,并且不会崩溃。这有什么问题?我想添加没有它的表,让我已经存在,并且我想要添加它而不向其他表添

  • 问题内容: 在一个SQL语句中,我尝试插入一行,如果由于约束而失败,则返回现有行。 我有: 该列具有唯一约束。我尝试在末尾追加,但这仍然不返回现有行。 为什么是这样?我以为我的最后一条语句将被执行并返回。有任何想法吗? 注意:由于某些复杂的竞争条件,我无法使用Postgres函数或多个SQL语句。 问题答案: WITH d(t, e) AS ( VALUES (‘abcdefg’, ‘2014-0