[英]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 實例,我使用了以下命令:
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=postgres postgres
這個命令用這兩個東西啟動了一個 Postgres 實例:
5432
映射到您的 Docker 容器的端口5432
)。postgres
用戶的密碼設置為postgres
(只是為了演示)。為了創建第一個遷移腳本,我使用了以下命令:
migrate create -ext sql -dir db/migrations -seq create_users_table
由於這個命令,我能夠創建文件夾路徑db/migrations
和其中的兩個文件(一個用於up
遷移,一個用於down
遷移)。
下一步是用CREATE
和DROP
語句填充上面創建的文件。 讓我們從上面的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.