【问题标题】:How to initialise PostgreSQL instance by creating database and tables如何通过创建数据库和表来初始化 PostgreSQL 实例
【发布时间】:2019-03-15 06:25:45
【问题描述】:

我需要使用 PostgreSQL 创建一个新数据库并且需要 通过创建数据库和 表。

我正在考虑创建一个 init.sql 文件并使用该文件 初始化 docker 镜像时与Docker 一起使用。

我需要一个处理initialising(根据模式版本有条件地创建模式和表)数据库的示例。

我有以下伪示例,并希望看到一个真实的 Postgres 示例。

伪例子:

1) 如果数据库不存在则创建数据库
2) 设置或增加数据库设计版本

// 创建版本 0 表
3) 如果表不存在则创建表

// 创建版本 1 表
4) 创建未来版本表并应用表更改

【问题讨论】:

  • 在初始化创建数据库后,您可能会受益于使用数据库迁移工具,例如 FlywayLiquibase。这些工具运行脚本来定义和填充您的模式、表和数据。这些工具还可以清除数据库的内容,以便在测试中重复使用,因此您无需重新创建新的空数据库,
  • 我赞同 Basil 的建议,使用模式迁移工具。我是 Liquibase 的粉丝,但 Flyway 或例如Sqitch 或者一样好

标签: postgresql


【解决方案1】:

CREATE DATABASE 只能作为单个语句执行。 所以它不能在函数或 DO 语句中运行。

You need

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

A detailed explanation

【讨论】:

  • 该脚本仅在登录不需要密码时才有效。
  • 脚本只解释了如何创建数据库,模式的创建和表的创建在这个答案中还没有详细说明。我首选的示例是有条件地创建的东西:数据库、模式和表,并满足模式版本控制。此链接显示了它是如何为 mySQL 完成的:database.guide/how-to-create-a-database-from-a-script-in-mysql
  • 是的,你是对的,我没有意识到,我试图丰富我的答案
  • @Wayne:那个链接对 Postgres 没用
猜你喜欢
  • 1970-01-01
  • 2019-05-24
  • 2016-04-03
  • 2012-10-02
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多