Go语言 戈兰移民回归“不变”

sycxhyv7  于 2023-01-10  发布在  Go
关注(0)|答案(1)|浏览(167)

我开始学习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,
);

我使用的命令:
第一个月
bash返回:
no change(无任何错误)
哪里会有问题?

jvlzgdj9

jvlzgdj91#

我整理了一个小指南来帮助你解决你的问题。请一定要跟着做,你会很好去!

运行Postgres

为了运行我用来测试解决方案的Postgres示例,我使用了以下命令:

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

此命令使用以下两个内容启动Postgres示例:
1.它设置端口Map(计算机上的端口5432Map到Docker容器的端口5432)。
1.它将postgres用户的密码设置为postgres(只是为了演示)。

创建迁移脚本

为了创建第一个迁移脚本,我使用了以下命令:

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

多亏了这个命令,我才能创建文件夹路径db/migrations和其中的两个文件(一个用于up迁移,另一个用于down迁移)。

用代码填充文件

下一步是用CREATEDROP语句填充上面创建的文件。

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

这样,您将得到以下输出:1/u create_users_table (44.392422ms).
如果运行两次,第二个输出将是:no change.
当您想要撤消迁移时,必须运行以下语句:

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

This will undo all of the migrations applied so far. For a deeper understanding, please refer to the official doc: https://github.com/golang-migrate/migrate#cli-usage.
让我知道这是否解决了您的问题,或者您是否需要其他任何东西!

相关问题