发布于 2026-01-06 7 阅读
0

安装并使用 Docker + Postgres + TablePlus 创建数据库模式 DEV's Worldwide Show and Tell Challenge Presented by Mux: Pitch Your Projects!

安装并使用 Docker + Postgres + TablePlus 创建数据库模式

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

欢迎回到后端大师班!

上一节课中,我们学习了如何使用dbdiagram.io设计数据库模式。

今天我们将学习如何在本地计算机上安装Docker Desktop,然后下载并启动PostgreSQL容器。

我们还将学习如何设置和使用TablePlusPostgres 进行连接和交互,并使用它来运行我们在上一讲中生成的 SQL 脚本,以创建我们的 Simple Bank 数据库模式。

这是YouTube上完整剧集播放列表的链接。

安装 Docker Desktop

好了,我们先来安装 Docker。在 Mac 上安装 Docker 超级简单!我们只需要打开Docker 官网,然后点击下载即可。

安装程序下载完成后,打开它,然后将 Docker 拖入“应用程序”文件夹。这样就完成了!Docker Desktop 已成功安装。

安装 Docker

让我们打开应用程序!Docker Desktop 启动需要一些时间,您可以点击此图标查看其状态。

docker-starting

现在显示的是黄色圆圈,表示 Docker Desktop 仍在启动中。当圆圈变为绿色时,就表示 Docker Desktop 已启动并可以使用了。

现在我们打开终端试试。我们使用docker ps命令列出所有正在运行的容器。目前列表为空,因为我们还没有运行任何容器。

docker-empty

如果我们运行docker images命令列出所有可用的 Docker 镜像,目前也是空的。那么,让我们学习如何拉取第一个镜像。

拉取 Postgres 镜像

在本课程中,我们将使用 PostgreSQL 作为应用程序的数据库引擎。所以让我们去Docker Hub搜索它的镜像。

搜索结果有很多,但我们将使用第一个,因为它是官方的Postgres镜像。

hub-postgres

如您所见,我们可以直接运行命令docker pull postgres来获取这张图片。这将拉取带有特定标签的图片latest。在本例中,它是版本 12。

还有很多其他版本,标签也各不相同。我经常使用alpine图片,因为它体积很小。这要归功于轻量级的 Alpine Linux 发行版。

那么,让我们打开终端,运行以下命令:



docker pull postgres:12-alpine


Enter fullscreen mode Exit fullscreen mode

获取图像的语法是docker pull <image_name>:<tag>

我们使用分隔符:来分隔图片名称及其标签(或版本)。您可以应用此分隔符下载任何版本的其他图片。

docker-pull

好了,图片下载成功。现在运行命令docker images,就能看到postgres图片了。

docker-images

它的标签是12-alpine。它还被分配了一个唯一的图像ID。看看这张图片的大小,只有大约150MB,非常小。

运行 Postgres 容器

好了,现在我们有了Postgres镜像,接下来学习如何运行它来启动Postgres数据库服务器容器。我们使用该docker run命令来实现这一目标。

语法如下:

docker-run

  • 以……开始docker run
  • 然后我们使用该--name标志来指定容器的名称。
  • -e标志用于设置容器的环境变量。在本例中,我们可以设置连接到 Postgres 的密码。
  • 然后,该-d标志用于告诉 Docker 在后台(或分离模式)运行此容器。
  • 最后一个参数是图像的名称:postgres

Docker镜像与容器

如果您是 Docker 新手,区分两个术语很重要:imagecontainer

基本上,容器是镜像中包含的应用程序的一个实例,它由docker run命令启动。

图片与容器

我们可以从单个镜像启动多个容器。

Docker 环境变量

我们还可以通过更改一些环境变量来定制容器。

例如,通过这个POSTGRES_USER变量,我们可以设置超级用户登录Postgres的用户名。如果未指定,postgres则将使用默认用户名。

类似地,该POSTGRES_DB变量允许我们设置默认数据库名称,该名称将在容器启动时创建。否则,默认数据库名称将与POSTGRES_USER.

好了,现在让我们在终端运行这个命令:



docker run --name postgres12 -e POSTGRES_USER=root -e POSTGRES_PASSWORD=secret -d postgres:12-alpine


Enter fullscreen mode Exit fullscreen mode
  • 这里我使用镜像名称postgres:12-alpine,因为我们想要运行这个特定版本的Postgres。
  • 至于密码,我以前都用secret很简单的。
  • root然后我通过环境变量设置了超级用户名POSTGRES_USER
  • 我将postgres12其用作容器的名称。

最后,我们必须向该命令添加一个重要的参数port mapping

Docker端口映射

这意味着什么?

简单来说,Docker 容器运行在一个独立的虚拟网络中,与我们所在的宿主机网络不同。

5432因此,除非我们告诉 Docker 在本地主机网络和容器网络之间创建某种“桥接”,否则我们不能直接连接到在容器网络端口上运行的 Postgres 服务器。

端口映射

我们通过使用-p标志来实现这一点,然后指定主机网络的端口,后跟一个冒号,再指定容器对应的端口。它们不一定相同,但我通常使用相同的端口以便于记忆。



docker run --name postgres12 -e POSTGRES_USER=root -e POSTGRES_PASSWORD=secret -p 5432:5432 -d postgres:12-alpine


Enter fullscreen mode Exit fullscreen mode

现在按下回车键,Docker 将启动 Postgres 容器,并返回其唯一的长 ID。我们可以使用docker ps命令列出所有正在运行的容器。

docker-ps

  • 如您所见,此容器 ID 是 docker 在上一个命令中返回的长 ID 的短前缀。
  • 镜像名称postgres带有标签12-alpine。如果我们运行命令docker images,可以看到它与我们之前使用命令拉取的镜像相同docker pull
  • 还有更多信息,例如容器的创建时间或容器的状态。
  • 端口映射正如我们所预期的那样,它将端口映射5432localhost容器中的同一端口。
  • 最后是容器的名称,也就是postgres12我们在docker run命令中设置的名称。

访问 Postgres 控制台

好了,Postgres 服务器已经准备就绪,让我们尝试连接到它并访问其控制台。

docker-exec

我们可以使用docker exec命令来实现这一点。它允许我们在正在运行的容器内运行一个特定的命令。



docker exec -it postgres12 psql -U root


Enter fullscreen mode Exit fullscreen mode
  • 我们使用该-it标志告诉 Docker 以交互式 TTY 会话的方式运行命令。
  • 然后我们指定容器的名称,即postgres12
  • 最后,我们需要在命令内部运行该命令postgres12。在本例中,我们希望运行psql命令来访问 Postgres 控制台。-U这里我们使用标志来指定psql要以该root用户身份连接。

瞧,我们现在进入了Postgres控制台。

postgres 控制台

这里需要注意的一点是:尽管我们在运行容器时设置了密码,但 Postgres 并没有要求输入密码。这是因为 Postgres 容器默认会在本地建立信任认证,因此从本地主机(容器内部)连接时不需要密码。

我们可以尝试一个简单的查询,例如select now()获取当前时间。然后按\q回车键退出控制台。

查看容器日志

这里我还想向您展示如何显示容器的日志。

docker-logs

我们使用docker logs命令,后面跟上容器名称。你也可以使用容器的唯一 ID。但我个人更喜欢用名称,因为它更容易记住。



docker logs postgres12


Enter fullscreen mode Exit fullscreen mode

这样,我们就可以轻松检查应用程序容器内部发生的情况。

好了,现在你知道如何使用一些基本的 docker 命令与 Postgres 容器交互并访问其控制台来运行 SQL 查询了。

安装 Table Plus

我将向您展示使用 Table Plus 管理和操作数据库的另一种更简便的方法。

桌子加

Table Plus 是一款图形用户界面工具,可以与多种不同的数据库引擎进行交互,例如 PostgreSQL、MySQL、Mongo、Redis 等。它非常易于使用,将极大地帮助我们加快开发速度。

好的,我们去tableplus.com下载。然后打开安装程序,把Table Plus拖到“应用程序”文件夹里。

创建新连接

现在我们打开应用程序。目前还没有数据库连接,所以我们创建一个新的连接!

选择页

数据库引擎有很多选择,但在我们这里,我们使用PostgreSQL

  • 现在我们输入连接名称。我把它叫做postgres12……
  • 主机是localhost(或127.0.0.1),端口5432默认为。
  • 用户名是root,密码是secret,这是我们在运行 postgres 容器时配置的。
  • 默认数据库名称为 root,与用户名相同,因为我们在启动容器时没有显式配置它。

好的,我们点击测试来测试连接。

测试连接

一切正常!现在我们可以点击“连接”按钮连接到数据库服务器了。

目前所有内容都是空的,因为我们还没有创建模式。但我们仍然可以通过点击SQL图标运行一些查询。我们来试试。select now();

tp-run-select-now

然后点击Run current按钮,或者直接按下Command Enter。结果将显示在下方部分。

创建简易银行方案

现在我们打开simple_bank.sql上一节课生成的文件。然后选择该文件中的所有查询,并按 Enter 键Command Enter运行它们。

创建模式

全部成功!

现在当我们按下Command R刷新键时,左侧将显示 3 个表格:accountsentriestransfers

我们可以点击他们的名字来查看数据,或者选择选项Structure卡来查看他们的架构结构。

表格结构

其中包含许多有用的信息,例如列名、数据类型、默认值、外键、是否允许为空等。

看起来某些外键列现在可以为空,但这并不是我们想要的,因为每个条目或转账都必须与其帐户关联。

所以,我们去dbdiagram.io来解决这个问题。

修复模式定义

我打算给表的某一列以及另一的另外两列添加not null约束,然后导出到 PostgreSQL。account_identriesfrom_account_idto_account_idtransfers



Table accounts as A {
  id bigserial [pk]
  owner varchar [not null]
  balance bigint [not null]
  currency varchar [not null]
  created_at timestamptz [not null, default: `now()`]

  Indexes {
    owner
  }
}

Table entries {
  id bigserial [pk]
  account_id bigint [ref: > A.id, not null]
  amount bigint [not null, note: 'can be negative or positive']
  created_at timestamptz [not null, default: `now()`]

  Indexes {
    account_id
  }
}

Table transfers {
  id bigserial [pk]
  from_account_id bigint [ref: > A.id, not null]
  to_account_id bigint [ref: > A.id, not null]
  amount bigint [not null, note: 'must be positive']
  created_at timestamptz [not null, default: `now()`]

  Indexes {
    from_account_id
    to_account_id
    (from_account_id, to_account_id)
  }
}


Enter fullscreen mode Exit fullscreen mode

现在我们删除旧文件,并将新文件重命名。然后用 Table Plus 打开它。

删除表

我要选中这三个表。右键单击,然后选择“删除” Delete。选择“删除”Cascade以确保所有引用数据都将被删除。然后单击“确定” OK

红色表格

现在可以看到表格还在,但它们被标记为红色。如果我们按下Command S保存键,DELETE TABLE命令将被执行,所有表格都将消失。

好了,现在让我们选择这个新模式simple_bank.sql文件中的所有查询。运行它们并刷新页面。

非空

3 个表再次出现。但这次,所有列都不允许为空。这正是我们想要的。

amount我们还可以看到在模式定义脚本中编写的列的注释。太棒了!

今天的讲座就到这里。希望你们觉得有趣且有用。

非常感谢您的阅读,我们下期再见!


如果您喜欢这篇文章,请订阅我们的 YouTube 频道在 Twitter 上关注我们,以便将来获取更多教程。


如果你想加入我在Voodoo的优秀团队,请点击此处查看我们的招聘信息。可远程办公,也可在巴黎/阿姆斯特丹/伦敦/柏林/巴塞罗那现场办公,公司提供签证担保。

文章来源:https://dev.to/techschoolguru/install-use-docker-postgres-table-plus-to-create-db-schema-44he