【问题标题】:knex migrate throws error relation already existsknex migrate throws 错误关系已经存在
【发布时间】:2018-06-29 18:40:18
【问题描述】:

我在我的 node.js 应用程序中使用 Heroku Postgres 数据库和 knexjs 作为 SQL 查询构建器。我尝试运行最新的knex migration,但收到错误relation already exists。当我尝试通过 sql 命令CREATE TABLE 创建表时,它可以正常工作。

knexfile.js

// Update with your config settings.

require('dotenv').config({ path: require('find-config')('.env') });

module.exports = {
  development: {
    client: 'pg',
    useNullAsDefault: true,
    connection: process.env.DATABASE_URL,
    searchPath: ['knex', 'public'],
  },

  staging: {
    client: 'postgresql',
    connection: {
      database: 'my_db',
      user: 'username',
      password: 'password'
    },
    pool: {
      min: 2,
      max: 10
    },
    migrations: {
      tableName: 'knex_migrations'
    }
  },

  production: {
    client: 'postgresql',
    connection: {
      database: 'my_db',
      user: 'username',
      password: 'password'
    },
    pool: {
      min: 2,
      max: 10
    },
    migrations: {
      tableName: 'knex_migrations'
    }
  }
};
  • 最新的迁移文件

迁移/20180120183247_users_test.js

/* eslint func-names: 0 */

exports.up = function (knex) {
  return knex.schema
    .createTable('users', (table) => {
      table.increments('id').primary();
      table.string('user_name', 100);
      table.text('password');
      table.string('email', 254);
    });
};

exports.down = function (knex) {
  return knex.schema
    .dropTableIfExists('users');
};

当我运行命令时:

knex migrate:latest --env development

我得到错误:

Using environment: development
Knex:warning - migration file "20180120184707_initial_schema.js" failed
Knex:warning - migration failed with error: create table "users" ("id" serial primary key, "user_name" varchar(100), "password" text, "email" varchar(254)) - relation "users" already exists
error: relation "users" already exists
    at Connection.parseE (.../node_modules/pg/lib/connection.js:546:11)
    at Connection.parseMessage (.../node_modules/pg/lib/connection.js:371:19)
    at TLSSocket.<anonymous> (.../node_modules/pg/lib/connection.js:114:22)
    at emitOne (events.js:115:13)
    at TLSSocket.emit (events.js:210:7)
    at addChunk (_stream_readable.js:252:12)
    at readableAddChunk (_stream_readable.js:239:11)
    at TLSSocket.Readable.push (_stream_readable.js:197:10)
    at TLSWrap.onread (net.js:589:20)

如果我连接到数据库并运行命令:

select * from users;

我明白了:

ERROR:  relation "users" does not exist
LINE 1: select * from users;

在 Heroku Postgres 设置中,我运行重置数据库来删除所有数据。我等待了 2-3 分钟,然后尝试再次运行最新的迁移,但我收到了相同的错误消息。

【问题讨论】:

    标签: postgresql heroku knex.js heroku-postgres node-postgres


    【解决方案1】:

    我不知道knex migrate:latest 命令运行所有迁移文件,所以表users 是在之前的迁移文件中创建的,这就是问题所在。

    【讨论】:

      【解决方案2】:

      我遇到了这个问题,希望有一个简单的解决方案,所以如果其他人想知道你可以做些什么来解决这个问题:

      如果您的数据库确实匹配迁移文件:

      进入knex_migrations 表(或记录迁移的表,如果您将其重命名为其他名称)并在name 列中添加一行包含相关迁移文件的名称。

      要检查它是否正常工作,请尝试knex migrate:list

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-13
        • 1970-01-01
        • 2022-06-26
        • 2013-02-04
        • 2018-10-05
        • 2017-08-28
        相关资源
        最近更新 更多