【问题标题】:Error when migrating with Laravel in Heroku to Postgres在 Heroku 中使用 Laravel 迁移到 Postgres 时出错
【发布时间】:2019-08-24 12:21:36
【问题描述】:

我正在使用 Laravel 5.6 和 Heroku 以及 Postgres 数据库。

我已将我的应用程序上传到 Heroku,登录表单正确显示给我。

使用以下方法迁移表时会出现问题: heroku run php artisan migrate 并使用 Heroku 的 Postgres,我正确地进行了所有配置,但是在迁移时会发生这种情况:

在 Connection.php 第 664 行:

SQLSTATE[42830]:无效的外键:7 错误:没有唯一的 约束匹配引用表“用户”的给定键(SQL: 更改表“sales”添加约束“sales_user_id_foreign”外键 ("user_id") 引用 "users" ("id"))

在 Connection.php 第 458 行:

SQLSTATE[42830]:无效的外键:7 错误:没有唯一的 为引用表“用户”匹配给定键的约束

奇怪的是,本地相同的迁移不会给我带来任何问题(MySQL),但带有 Postgres 的 Heroku 显示错误。

这些是我的用户和销售迁移:

用户:

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->integer('id')->unsigned();
        $table->foreign('id')->references('id')->on('people')->onDelete('cascade');

        $table->string('user')->unique();
        $table->string('password');
        $table->boolean('state')->default(1);

        $table->integer('idRole')->unsigned(); 
        $table->foreign('idRole')->references('id')->on('roles');

        $table->rememberToken();
        //$table->timestamps();
    });
}

销售:

public function up()
{
    Schema::create('sales', function (Blueprint $table) {

        $table->increments('id');
        $table->integer('client_id')->unsigned();
        $table->foreign('client_id')->references('id')->on('people');
        $table->unsignedInteger('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');
        $table->dateTime('date_time');
        $table->decimal('total', 11, 2);
        $table->string('status', 20);

        $table->timestamps();
    });
}

我不知道为什么我在 Heroku 中出现此错误,但一切都在本地运行。我该如何解决这个问题?

【问题讨论】:

    标签: laravel heroku database-migration heroku-postgres


    【解决方案1】:

    这是因为表users 上的id 列没有唯一约束。 您可以将id 列设置为自动增量并再次运行迁移:

    用户

    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            // Other codes
        });
    }
    

    【讨论】:

    • 感谢您的回答。但是我不需要您提供给我的那个 ID,因为我从与 People 表的关系中获取它。那我该怎么办?
    • 但是你在Sale 表中通过user_id 建立UserSale 表之间的关系。顺便说一句,您需要确保您的表始终将主键作为唯一约束。
    • 是的,这种关系是与用户 ID 建立的,并且在本地使用 MySQL 对我来说非常适合。我不明白 Postgres 会发生什么
    • 您使用的 MySQL 存储引擎是什么。是 InnoDB 吗? User 表的问题是它可能有重复的 ID
    【解决方案2】:

    奇怪的是,本地相同的迁移不会给我带来任何问题(MySQL),但带有 Postgres 的 Heroku 显示错误。

    在开发和生产中使用相同的数据库软件总是一个好主意。 MySQL 和 PostgreSQL 不是相互替代的,即使使用 ORM 和模式迁移工具也是如此。在某些情况下,一个人会快乐而另一个人不会。

    我怀疑如果您在 Heroku 上使用 MySQL,您的问题将会消失。 Heroku 本身不提供 MySQL,但您可以使用 a couple of addons。 JawsDB 和 ClearDB 都是流行的选项,或者如果您愿意,您可以将自己的 MySQL 数据库托管在 RDS 之类的地方。

    您也可以在本地切换到 Postgres,看看是否可以重现错误。

    【讨论】:

      猜你喜欢
      • 2012-09-18
      • 2017-06-18
      • 2021-05-23
      • 2016-10-03
      • 2018-01-27
      • 2021-02-21
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多