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

问题描述 投票:1回答:2

我正在与Postgres数据库一起使用Laravel 5.6和Heroku。

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

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

在Connection.php第664行中:

SQLSTATE [42830]:无效的外键:7错误:没有唯一约束匹配给定的引用“用户”的键(SQL:alter table“sales”add constraint“sales_user_id_foreign”foreign key(“user_id”)引用“us” ers“(”id“))

在Connection.php第458行:

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

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

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

用户:

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
2个回答
0
投票

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

用户

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

0
投票

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

在开发和生产中使用相同的数据库软件总是一个好主意。即使使用ORM和架构迁移工具,MySQL和PostgreSQL也不是彼此的替代品。肯定会有一个人会幸福而另一个人却不会幸福。

我怀疑如果你在Heroku上使用MySQL,你的问题就会消失。 Heroku不提供MySQL本身,但你可以使用a couple of addons。 JawsDB和ClearDB都是流行的选择,或者如果你愿意,你可以在像RDS这样的东西上托管你自己的MySQL数据库。

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

© www.soinside.com 2019 - 2024. All rights reserved.