由Okure U. Edet撰写

Go是一种快速编程语言,语法相对简单。在学习Go的过程中,学习如何构建API以及如何使用它们与数据库通信是很重要的。在学习过程中,我决定接受一个项目,该项目在这方面帮助了我:一个简单的库存跟踪API。

在与Postgres等SQL数据库合作时,我了解到及时更改数据库是很重要的。所以如果你有一个可能会在未来修改的架构,最好的方法是使用数据库迁移。它确保对数据库的更改准确无误,不会影响现有数据。

在这篇文章中,你将学习如何使用Docker和Postgres进行数据库迁移。

目录

什么是数据库迁移?

什么是数据库迁移,你为什么要使用它?嗯,作为一名后端开发者,当你在一个需要将数据存储在数据库中的项目中工作时,你需要为你想要存储的数据开发一个模式。

数据库迁移帮助你管理数据库中的数据结构,在这种情况下,是一个关系型数据库。迁移有助于将模式从当前状态更改为特定/期望的状态。这可能涉及添加表和列,删除元素或更改类型和约束。

数据库迁移的一个重要性是使数据库中的更改可重复且无缝,而无需担心数据丢失。

如果你不确定最终的数据库模式是什么样的,建议使用迁移。在这种情况下,你可以逐步实施更改。

如何启动和运行Docker容器

打开你的终端,创建一个新的目录 mkdir tracking-inventory-app

然后从Docker Hub拉取一个postgres镜像。我使用了postgres:14-alpine标签。你可以使用任何标签。

在你的终端中,粘贴以下内容并按回车键:

$ docker pull postgres:14-alpine

安装后,使用docker run命令启动容器:

$ docker run --name postgres14 -e POSTGRES_USER=root -e POSTGRES_PASSWORD=passwordd -p 5432:5432 -d postgres:14-alpine

--name标志指的是容器的名称。-e标志指的是环境变量。-p标志意味着发布。您应该在指定的端口上运行您的容器。-d标志意味着您希望以分离模式运行它。

按回车键后,如果您安装了Docker Desktop,请打开它。如果没有,您可以从docker网站下载。

在您的Docker Desktop中,您应该看到容器已启动:

您可以使用TablePlus连接到数据库:

测试连接。如果它说ok,那么连接。如果您在Windows上,并且显示身份验证错误,请转到开始按钮并点击运行。在弹出窗口中,输入services.msc并按回车。查找postgres并点击停止服务。然后再次尝试连接。

使用TablePlus创建和运行架构的方法

我已经使用db diagram为tracking-inventory项目创建了一个预定义的架构/模型。这个tracking-inventory应该允许您添加一个项目、序列号和价值。因此,架构将具有itemserial_numberidcreated_at字段。

CREATE TABLE "inventory" (
  "id" uuid PRIMARY KEY,
  "item" varchar NOT NULL,
  "serial_number" varchar NOT NULL,
  "user" uuid NOT NULL,
  "created_at" timestamptz NOT NULL DEFAULT 'now()'
);

CREATE TABLE "user" (
  "id" uuid PRIMARY KEY,
  "name" varchar NOT NULL,
  "email" varchar UNIQUE NOT NULL,
  "password" varchar NOT NULL,
  "created_at" timestamptz NOT NULL DEFAULT 'now()'
);

CREATE INDEX ON "inventory" ("item");

ALTER TABLE "inventory" ADD FOREIGN KEY ("user") REFERENCES "user" ("id");

我的就是这样。您可以打开您的TablePlus并添加生成的PostgreSQL代码并运行它。

如何安装golang-migrate

下一步是 在您的系统上安装golang-migrate。我在这篇教程中使用的是运行在Windows上的Linux。

要安装它,请访问这个文档

我使用的是Linux,所以我将使用curl

$ curl -L https://github.com/golang-migrate/migrate/releases/download/v4.12.2/migrate.linux-amd64.tar.gz | tar xvz

一旦成功安装,在您的终端上,运行命令migrate -help以查看其各种命令。

如何创建新的迁移

安装golang-migrate后,您可以创建一个新的迁移脚本。

首先,在您的终端中,在tracking-app目录内,使用code命令打开VS Code。

完成后,创建一个名为db的新文件夹,在db文件夹内再创建一个名为migrations的文件夹。

然后在您的终端上运行以下命令:

 $ migrate create -ext sql -dir db/migration -seq tracking_inventory_schema

这里的-ext标志指的是您希望迁移文件具有的扩展名。在此案例中,它是sql。-dir标志指的是您希望创建文件的目录。-seq标志指的是迁移文件的顺序号。

在VS Code内部,应该有两个文件:一个用于up,另一个用于down。前者用于对目录进行正向更改,而后者用于撤销更改。

up文件中,您需要将您的架构粘贴到文件中。

我的架构是这样的:

CREATE TABLE "inventory" (
  "id" uuid PRIMARY KEY,
  "item" varchar NOT NULL,
  "serial_number" varchar NOT NULL,
  "user" uuid NOT NULL,
  "created_at" timestamptz NOT NULL DEFAULT 'now()'
);

CREATE TABLE "user" (
  "id" uuid PRIMARY KEY,
  "name" varchar NOT NULL,
  "email" varchar UNIQUE NOT NULL,
  "password" varchar NOT NULL,
  "created_at" timestamptz NOT NULL DEFAULT 'now()'
);

CREATE INDEX ON "inventory" ("item");

ALTER TABLE "inventory" ADD FOREIGN KEY ("user") REFERENCES "user" ("id");

你的可能因你正在构建的项目不同而有所不同。

对于down文件,只需粘贴以下内容:

DROP TABLE IF EXISTS inventory;
DROP TABLE IF EXISTS user;

首先应该删除库存表,因为它引用了用户表。

如何在Docker Postgres容器内和外部创建和删除数据库

使用以下命令检查你的docker容器是否正在运行:

$ docker ps

如果它没有运行,使用命令docker start ${container name}来启动它。

下一步是使用以下命令访问Postgres shell,因为我是在Linux上:

$ docker exec -it postgres14 bin/bash

这里的-it标志代表交互式壳/终端。在这个壳中,你可以运行createdb命令:

/# createdb --username=root --owner=root tracking_inventory

创建后,你可以运行psql命令与数据库互动:

/# psql tracking-inventory
psql (14.12)
Type "help" for help.

tracking_inventory=#

你也可以使用dropdb命令删除数据库。

要离开这个壳,使用exit命令。

在Postgres容器外部创建数据库,请粘贴以下命令:

$ docker exec -it postgres14 createdb --username=root --owner=root tracking_inventory

如何在TablePlus中查看数据库

要查看你创建的数据库,请使用我们之前建立的连接。它会带你到根数据库,然后点击顶部的数据库图标。

创建的数据库将出现,然后只需点击open来打开它。

如何运行迁移

在终端中运行此命令以运行迁移:

$ migrate -path db/migration -database "postgresql://root:passwordd@localhost:5432/tracking_inventory?sslmode=disable" -verbose up

`-path`标志指定了包含迁移文件的路径。`-database`选项指定了数据库的URL。

在URL中,驱动程序是`postgresql`。用户名和密码分别是`root`和`passwordd`。还需要添加`sslmode=disable`选项,因为Postgres默认不启用SSL。

现在运行迁移:

$ migrate -path db/migration -database "postgresql://root:passwordd@localhost:5432/tracking_inventory?sslmode=disable" -verbose up
calhost:5432/tracking_inventory?sslmode=disable" -verbose up
2024/06/25 00:13:25 Start buffering 1/u tracking_inventory_schema
2024/06/25 00:13:25 Read and execute 1/u tracking_inventory_schema
2024/06/25 00:13:26 Finished 1/u tracking_inventory_schema (read 43.186044ms, ran 255.501635ms)
2024/06/25 00:13:26 Finished after 312.928488ms
2024/06/25 00:13:26 Closing source and database

迁移成功!

刷新数据库并查看新表:

##结论

在整个教程中,您学会了如何使用Docker和Postgres在Go中无缝编写和运行数据库迁移。希望您从这篇文章中学到了很多。

您可以通过twitterlinkedin与我联系。