簡體   English   中英

Golang-migrate 返回“無變化”

[英]Golang-migrate returns "no change"

我開始學習 Go 和 SQL。我嘗試在我的 go 項目中使用 golang-migrate 進行初始遷移。 數據庫是postgresql

這是遷移文件:

CREATE TABLE users 
(
    id serial not null unique,
    name varchar(255) not null,
    username varchar(255) not null unique,
    password_hash varchar(255) not null,
)

CREATE TABLE todo_lists
(
    id serial not null unique,
    title varchar(255) not null,
    description varchar(255),
);

CREATE TABLE users_lists
(
    id serial not null unique,
    user_id int references users (id) on delete cascade not null,
    list_id int references todo_lists (id) on delete cascade not null,
);

CREATE TABLE todo_items
(
    id serial not null unique,
    title varchar(255) not null,
    description varchar(255),
    done boolean not null default false,
);

CREATE TABLE lists_items
(
    id serial not null unique,
    item_id int references todo_items (id) on delete cascade not null,
    list_id int references todo_lists (id) on delete cascade not null,
);

我使用的命令:

migrate -path./schema -database 'postgres://postgres:root@localhost:5432/to_do?sslmode=disable' up

bash 返回:

no change (沒有任何錯誤)

哪里會出問題?

我整理了一份小指南來幫助您解決問題。 請務必跟隨,你會很高興去!

運行 Postgres

為了運行我用來測試我的解決方案的 Postgres 實例,我使用了以下命令:

docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=postgres postgres

這個命令用這兩個東西啟動了一個 Postgres 實例:

  1. 它設置端口映射(您機器上的端口5432映射到您的 Docker 容器的端口5432 )。
  2. 它將postgres用戶的密碼設置為postgres (只是為了演示)。

創建遷移腳本

為了創建第一個遷移腳本,我使用了以下命令:

migrate create -ext sql -dir db/migrations -seq create_users_table

由於這個命令,我能夠創建文件夾路徑db/migrations和其中的兩個文件(一個用於up遷移,一個用於down遷移)。

用代碼填充文件

下一步是用CREATEDROP語句填充上面創建的文件。 讓我們從上面的up

000001_create_users_table.up.sql文件
CREATE TABLE IF NOT EXISTS users 
(
    id serial not null unique,
    name varchar(255) not null,
    username varchar(255) not null,
    password_hash varchar(255) not null
);

CREATE TABLE IF NOT EXISTS todo_lists
(
    id serial not null unique,
    title varchar(255) not null,
    description varchar(255)
);

CREATE TABLE IF NOT EXISTS users_lists
(
    id serial not null unique,
    user_id int references users (id) on delete cascade not null,
    list_id int references todo_lists (id) on delete cascade not null
);

CREATE TABLE IF NOT EXISTS todo_items
(
    id serial not null unique,
    title varchar(255) not null,
    description varchar(255),
    done boolean not null default false
);

CREATE TABLE IF NOT EXISTS lists_items
(
    id serial not null unique,
    item_id int references todo_items (id) on delete cascade not null,
    list_id int references todo_lists (id) on delete cascade not null
);

為了使遷移冪等,我添加了IF NOT EXISTS檢查。 當您要編寫遷移時,請將此作為最佳實踐。

000001_create_users_table.down.sql文件
DROP TABLE IF EXISTS users_lists;
DROP TABLE IF EXISTS lists_items;
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS todo_lists;
DROP TABLE IF EXISTS todo_items;

這同樣適用於IF EXISTS檢查。 注意刪除內容的順序,因為對象的依賴性很容易導致錯誤。

運行遷移

要運行此遷移,請確保已創建 to_do 數據庫 要應用遷移運行:

migrate -database 'postgres://postgres:postgres@localhost:5432/to_do?sslmode=disable' -path ./db/migrations up

有了這個,你會得到這個 output: 1/u create_users_table (44.392422ms)
如果你運行兩次,第二個 output 將是: no change

當您想要撤消遷移時,您必須運行以下語句:

migrate -database 'postgres://postgres:postgres@localhost:5432/to_do?sslmode=disable' -path ./db/migrations down

這將撤消到目前為止應用的所有遷移。 更深入的理解請參考官方文檔: https://github.com/golang-migrate/migrate#cli-usage

讓我知道這是否解決了您的問題,或者您是否需要其他任何東西!

我通過刪除遷移表並更正 sql 文件解決了這個問題(刪除最后一列的每個字符串中的“,”)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM