我想通过JDBC创建一个不存在的数据库。与MySQL不同,PostgreSQL不支持创建如果不存在
语法。实现这一点的最佳方法是什么?
应用程序不知道数据库是否存在。它应该检查,如果数据库存在,应该使用它。因此,连接到所需的数据库是有意义的,如果由于数据库不存在而导致连接失败,则应创建新数据库(通过连接到默认的postgres数据库)。我检查了Postgres返回的错误代码,但找不到任何相关的代码。
实现这一点的另一种方法是连接到postgres数据库,检查所需的数据库是否存在,并采取相应的措施。第二个有点乏味。
有没有办法在Postgres中实现此功能?
如果不关心数据,可以先删除数据库,然后重新创建:
DROP DATABASE IF EXISTS dbname;
CREATE DATABASE dbname;
另一种选择是,如果您希望有一个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
您可以询问系统目录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-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