在Heroku中使用Laravel迁移到Postgres时出错

时间:2019-04-03 04:43:48

标签: laravel heroku database-migration heroku-postgres

我正在使用带有Postgres数据库的Laravel 5.6和Heroku。

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

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

  

在Connection.php第664行中:

     

SQLSTATE [42830]:无效的外键:7错误:没有唯一的   约束匹配给定表“用户”的给定键(SQL:   更改表“ sales”添加约束“ sales_user_id_foreign”外键   (“ user_id”)引用了“ us ers”(“ 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中有此错误,但是一切都在本地运行。我该如何解决?

2 个答案:

答案 0 :(得分:0)

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

用户

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

答案 1 :(得分:0)

  

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

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

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

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