我正在處理一個 PostgreSQL 資料庫。為了在其他不錯的功能中強制執行遷移版本管理,我發現Migrate是用 Go 撰寫的資料庫遷移,并將其添加到我的專案中。到目前為止,我還沒有遇到任何問題,但是,我遇到了一個問題,如果沒有 hacky 解決方法,我將無法克服。所以背景關系如下,我有如下所示的遷移檔案,有 4 個表:用戶、運動、挑戰和活動。當我運行時migrate up,migrate拋出以下錯誤:
(details: pq: syntax error at or near "user")
error: Dirty database version 1. Fix and force version.
如果我user_id從表中洗掉該列,migrate則創建的所有表都可以正常作業。但是,就像現在一樣,user_id它不起作用。有人會知道這里有什么問題嗎?什么是使我的遷移正常作業的修復方法?
遷移檔案:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE IF NOT EXISTS "user"(
"id" UUID NOT NULL PRIMARY KEY DEFAULT uuid_generate_v4(),
"username" VARCHAR(50) UNIQUE NOT NULL,
"password" VARCHAR(50) NOT NULL,
"created_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS "sport"(
"id" UUID NOT NULL PRIMARY KEY DEFAULT uuid_generate_v4(),
"sport_name" VARCHAR(50) UNIQUE NOT NULL,
"created_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS "challenge"(
"id" UUID NOT NULL PRIMARY KEY DEFAULT uuid_generate_v4(),
"challenge_name" VARCHAR(50) UNIQUE NOT NULL,
"created_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
"sport_id" UUID NOT NULL REFERENCES sport(id),
"distance_goal" VARCHAR(50),
"time_goal" VARCHAR(50)
);
CREATE TABLE IF NOT EXISTS "activity"(
"id" UUID NOT NULL PRIMARY KEY DEFAULT uuid_generate_v4(),
"created_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
"date" VARCHAR(50),
"time" VARCHAR(50),
"distance" VARCHAR(50),
"user_id" UUID NOT NULL REFERENCES user(id),
"sport_id" UUID NOT NULL REFERENCES sport(id),
"challenge_id" UUID REFERENCES challenge(id)
);
如果您的環境中沒有,那么您有一個 docker-compose 包含運行 migrate 和 Postgres DB :):
version: '3.3'
services:
# Based in https://stackoverflow.com/questions/55779979/how-to-run-golang-migrate-with-docker-compose/55779980
steelman_db:
image: postgres:13
networks:
database_net:
aliases:
- database_host
environment:
POSTGRES_DB: steelman_db
POSTGRES_USER: steelman
POSTGRES_PASSWORD: steelman
ports:
- "5432"
healthcheck:
test: pg_isready -U steelman -d steelman_db
interval: 10s
timeout: 30s
retries: 5
migrate:
image: migrate/migrate
networks:
- database_net
volumes:
- ./db/migrations:/migrations
command: ["-path", "/migrations", "-database", "postgres://steelman:steelman@database_host:5432/steelman_db?sslmode=disable", "up"]
restart: "on-failure"
depends_on:
- steelman_db
links:
- steelman_db
networks:
database_net:
uj5u.com熱心網友回復:
問題是user一個保留字,使用時需要雙引號。換句話說,它不是識別符號的好名字。如果你想繼續使用它,那么你必須改變:
"user_id" UUID NOT NULL REFERENCES user(id),
到:
"user_id" UUID NOT NULL REFERENCES "user"(id),
以及您使用它的任何其他地方。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/335124.html
標籤:PostgreSQL 移民
上一篇:盡管在列上缺少選擇權,但仍洗掉行
下一篇:子字串不能適合正則運算式
