敖库雷·U·艾德
Go 是一種快速的程式設計語言,語法相對簡單。在学习 Go 的過程中,學習如何建立 API 以及如何使用它們與數據庫進行通信是非常重要的。在學習過程中,我決定承接一個項目,這個項目對我來說非常有幫助:一個簡單的庫存追蹤 API。
當與如 Postgres 這樣的 SQL 數據庫合作時,我學會了一個重要的道理:及时對數據庫進行更改。所以如果你有一個将来可能修改的結構(schema),最好的做法就是使用數據庫遷移(database migrations)。這能確保對數據庫的更改精準無誤,而不會影響既有數據。
在本文中,你將學習如何使用 Docker 和 Postgres 進行數據庫遷移。
目錄
- 什麼是數據庫遷移?
- 如何開始和運行 Docker 容器
- 如何使用 TablePlus 創建和運行結構
- 如何安裝 golang-migrate
- 如何創建新的遷移
- 如何在 Docker Postgres 容器內外創建和刪除數據庫
- 如何於TablePlus中查看資料庫
- 如何執行資料庫遷移
- 結論
什麼是資料庫遷移?
什麼是資料庫遷移以及為什麼應該使用它?其實,作為一個後端開發者,當你在進行需要將資料存儲在資料庫中的項目時,你將需要開發一個用於存儲資料的架构。
資料庫遷移有助於管理資料庫內部的數據結構,在這裡,我們指的是關聯式資料庫。遷移有助於從目前的状态修改架构至特定的/期望的状态。這可能涉及新增表格和列,移除元素或更改類型和限制。
資料庫遷移的一個重要性是使資料庫中的變更可重複且無縫,而無需擔心資料丟失。
如果你不確定最終的數據架構會是什麼样子,建議使用遷移。在這種情況下,您可以逐步實施變更。
如何開始和運行Docker容器
打開你的終端機,創建一個新目錄 mkdir tracking-inventory-app
。
然後從Docker Hub拉取一個postgres映像。我使用了postgres:14-alpine
標籤。您可以使用任何您想要的標籤。
在您的終端機中,複製以下內容並按Enter:
$ 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` 旗帜意味著您希望以分离模式運行。
按Enter後,如果您已經安裝了Docker Desktop,請打開它。如果没有,您可以從 docker網站 下載。
在您的Docker Desktop中,您應該看到容器已經啟動:
您可以使用TablePlus與数据库建立連接:
測試連接。如果它說ok,那麼連接。如果您在Windows上,並且顯示身份驗證錯誤,請转到您的開始按鈕並點擊運行
。在彈出窗口中,輸入services.msc
並按Enter。尋找postgres並點擊停止服務。然後再試著連接。
使用TablePlus創建和運行架构的方法
我使用 db diagram為tracking-inventory項目創建了預定義的架构/模型的 diagram。這個tracking-inventory應該允許您添加一個項目、序列號和價值。因此,該架构將具有item
、serial_number
、id
和created_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
以查看其各種命令。
如何創建新的遷移
install 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 壳牌,因為我目前在 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 中查看數據庫
要查看您已創建的數據庫,請使用我們之前建立的光纤連接。它將带您到根數據庫,然後在頂部 clicks on the db icon.
創建的數據庫將出現,然後只需點擊 open
以打開它
如何運行迁移
在您的終端中運行以下命令以運行迁移:
$ migrate -path db/migration -database "postgresql://root:passwordd@localhost:5432/tracking_inventory?sslmode=disable" -verbose up
The -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中無縫地编写和運行數據庫遷移。
Source:
https://www.freecodecamp.org/news/how-to-create-database-migrations-in-go/