当前位置: 首页 > 知识库问答 >
问题:

PostgreSQL迁移语法错误与用户REFERENCE列

仇建茗
2023-03-14

我正在处理PostgreSQL数据库。为了在其他不错的功能中实施迁移版本管理,我找到了用Go编写的迁移数据库迁移,并将其添加到我的项目中。到目前为止,我还没有遇到任何问题,但是,我遇到了一个问题,如果没有hacky解决方案,我无法克服。因此上下文如下,我有如下所示的迁移文件,其中包含4个表:user、sports、Chall和active。当我运行迁移向上时,迁移会抛出以下错误:

(details: pq: syntax error at or near "user")
error: Dirty database version 1. Fix and force version.

如果我从表中删除user\u id列,migrate可以正常工作,所有表都会创建。但是,正如现在使用的用户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数据库,它包含运行migrate和Postgres数据库的命令:):

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:

共有1个答案

索和璧
2023-03-14

问题是,用户是一个保留字,使用时需要双引号。换句话说,它不是标识符的好名称。如果您想继续使用它,则必须更改:

"user_id" UUID NOT NULL REFERENCES user(id),

收件人:

"user_id" UUID NOT NULL REFERENCES "user"(id),

以及您使用它的任何其他地方。

 类似资料:
  • 我已经将我的flask web应用程序部署到Heroku,Heroku最初使用的是SQLite本地数据库,我的所有命令都可以正常工作。现在,当我部署到Heroku并使用PostgreSQL数据库时,我会遇到一些语法和编程错误,如上图所示。我没有在本地得到这些错误,现在当我部署之后,我得到了这些错误。请告知,我的代码如下:

  • 这是代码: 和错误: [Illuminate\database\queryException]SQLSTATE[HY000]:一般错误:1靠近“)”:语法错误(SQL:创建表“articles”(“id”integer not null主键自动递增,“user_id”integer not null,“title”varchar not null,“body”text not null,“crea

  • 我正在测试Cognito以替换现有的身份验证代码,并发现了一个bug。我有一个用户池,并实现了用户迁移lambda来测试迁移过程。用户池设置为使用电子邮件作为用户名。 从我的客户端我用现有凭据登录,用户迁移lambda执行以下操作: 登录成功,我的用户已迁移到Cognito。但是,用户立即收到并发送电子邮件,主题为“您的临时密码”和正文“您的用户名是 *****@******.com,临时密码是

  • 我将我的数据库后端从sqlite3更改为PostGRE。当我尝试运行迁移时,我有一个错误 要执行的操作:同步未迁移的应用程序:messages、avtofarm、smart_selects、staticfiles、thumbnail应用所有迁移:contenttypes、admin、callboard、auth、sessions同步未迁移的应用程序:创建表...正在运行延迟SQL...正在安装自定

  • 我的错误 我想知道做这次迁移的人打算做什么。

  • 我对rails迁移有一个奇怪的问题。我的db/migrate文件夹包含迁移文件,所有文件都工作正常。但几分钟前,我使用rails g migration MigrationName创建了一个新文件,它生成了一个新文件。然后,当我运行rakedb:migrate时,它会回滚所有内容,我的模式版本变为0。现在,当我运行rake db:migrate时,它什么也不做,而db/migrate包含我的所有迁