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

是否为PostgreSQL模拟创建数据库?

秦毅
2023-03-14

我想通过JDBC创建一个不存在的数据库。与MySQL不同,PostgreSQL不支持创建如果不存在语法。实现这一点的最佳方法是什么?

应用程序不知道数据库是否存在。它应该检查,如果数据库存在,应该使用它。因此,连接到所需的数据库是有意义的,如果由于数据库不存在而导致连接失败,则应创建新数据库(通过连接到默认的postgres数据库)。我检查了Postgres返回的错误代码,但找不到任何相关的代码。

实现这一点的另一种方法是连接到postgres数据库,检查所需的数据库是否存在,并采取相应的措施。第二个有点乏味。

有没有办法在Postgres中实现此功能?

共有3个答案

羊舌兴德
2023-03-14

如果不关心数据,可以先删除数据库,然后重新创建:

DROP DATABASE IF EXISTS dbname;
CREATE DATABASE dbname;
狄高畅
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
章海
2023-03-14

您可以询问系统目录pg\U数据库-可从同一数据库群集中的任何数据库访问。棘手的部分是创建数据库只能作为一条语句执行。手册:

CREATE DATABASE不能在事务块内执行。

因此,它不能直接在函数或DO语句中运行,而它会隐式地在事务块中运行。Postgres 11引入的SQL过程对此也没有帮助。

您可以通过有条件地执行DDL语句,在psql中解决此问题:

SELECT 'CREATE DATABASE mydb'
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'mydb')\gexec

手册:

\gexec

将当前查询缓冲区发送到服务器,然后将查询输出的每一行(如果有)的每一列视为要执行的SQL语句。

使用gexec,只需调用psql一次:

echo "SELECT 'CREATE DATABASE mydb' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'mydb')\gexec" | psql

您的连接可能需要更多psql选项;角色、端口、密码...请参阅:

  • 使用不带密码的psql命令运行批处理文件

不能使用psql-c“SELECT…\gexec”调用相同的命令,因为它是一个psql元命令,而选项需要一个单独的命令,手动声明:

命令必须是完全可由服务器解析的命令字符串(即,它不包含特定于psql的功能)或单个反斜杠命令。因此,您不能在-c选项中混合使用SQL和psql元命令。

您可以使用dblink连接返回到当前数据库,该数据库在事务块之外运行。因此,也不能回滚效果。

为此安装附加模块dblink(每个数据库一次):

  • 如何在PostgreSQL中使用(安装)dblink?

然后:

DO
$do$
BEGIN
   IF EXISTS (SELECT FROM pg_database WHERE datname = 'mydb') THEN
      RAISE NOTICE 'Database already exists';  -- optional
   ELSE
      PERFORM dblink_exec('dbname=' || current_database()  -- current db
                        , 'CREATE DATABASE mydb');
   END IF;
END
$do$;

同样,您可能需要更多用于连接的psql选项。请参阅Ortwin的补充答案:

  • 是否为PostgreSQL模拟创建数据库

dblink的详细说明:

  • 如何在PostgreSQL中进行大型非阻塞更新?

您可以将其作为重复使用的函数。

 类似资料:
  • PostgreSQL 创建数据库可以用以下三种方式: 1、使用 CREATE DATABASE SQL 语句来创建。 2、使用 createdb 命令来创建。 3、使用 pgAdmin 工具。 CREATE DATABASE 创建数据库 CREATE DATABASE 命令需要在 PostgreSQL 命令窗口来执行,语法格式如下: 例如,我们创建一个 runoobdb 的数据库: created

  • 这个代码不起作用。谁能告诉我在哪里可以找到用C#动态创建Postgresql数据库和表的例子? 数据库已创建,但我在创建表时遇到一个无声的失败。

  • 我在Tomcat(9)上运行了Spring Boot(2.3.4)应用程序。当我试图构建项目时,flowable(6.6.0)引擎会出现这个错误。架构已经创建,但它试图再次创建。我的问题是,我无法将war代码部署到服务器上,因为它。

  • 问题内容: 我正在使用PostgreSQL和Spring 4,希望我的应用在运行时自动创建数据库。 我的实体类是: HibernateConfig.java application.properties 但是,当我运行SQL访问表User时,将出现错误:表’User’不存在。 如何使Hibernate自动创建数据库? 问题答案: 该物业将为您解决问题。创建SessionFactory时,它将自动验

  • 我正在使用PostgreSQL和Spring 4,并希望我的应用程序在运行时自动创建数据库。 我的实体类是: HibernateConfig。Java语言 application.properties 但当我运行SQL访问表User时,会出现错误:表“User”不存在。 如何使Hibernate自动创建数据库?

  • 问题内容: 将Apache Derby与Java结合使用(J2ME,但我认为这没有什么不同),是否有任何方法可以检查数据库是否已经存在并包含表? 问题答案: 除了MySQL之外,我什么都不知道,只有很少的解决方法,这与MySQL具有IF EXIST的功能不同。 您要做的是,尝试连接数据库,如果不可能的话。在成功建立连接之后,您可以执行简单的选择,例如SELECT count(*)FROM TABL