Ошибка при миграции с Laravel в Heroku на Postgres - PullRequest
1 голос
/ 03 апреля 2019

Я работаю с Laravel 5.6 и Heroku с базой данных Postgres.

Я загрузил свое приложение в Heroku, форма входа показывает его правильно.

Проблема возникает при выполнении миграции таблиц с: heroku run php artisan migrate и используя Postgres of Heroku, я сделал все настройки правильно, но при выполнении миграции это происходит:

В строке Connection.php 664:

SQLSTATE [42830]: Неверный внешний ключ: 7 ОШИБКА: нет уникального ограничение соответствия заданным ключам для указанных "пользователей" (SQL: изменить таблицу «продажи» добавить ограничение «внешний_пользователь_идентификатор_приложения» внешний ключ ("user_id") ссылается на "us ers" ("id"))

В строке 458 Connection.php:

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, но все работает локально. Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Странно то, что одна и та же миграция локально не вызывает у меня никаких проблем (MySQL), но Heroku с Postgres показывает ошибку.

Всегда полезно использовать одно и то же программное обеспечение для баз данных при разработке и производстве. MySQL и PostgreSQL не являются взаимозаменяемыми заменами друг друга, даже с ORM и инструментом миграции схемы. Определенно есть ситуации, когда один будет счастлив, а другой - нет.

Я подозреваю, что если вы используете MySQL на Heroku, ваша проблема исчезнет. Heroku не предоставляет сам MySQL, но есть пара дополнений , которые вы можете использовать. JawsDB и ClearDB являются популярными опциями, или, если вы предпочитаете, вы можете разместить свою собственную базу данных MySQL на чем-то вроде RDS .

Вы также можете переключиться на Postgres локально и посмотреть, сможете ли вы воспроизвести ошибку.

0 голосов
/ 03 апреля 2019

Это потому, что столбец id в таблице users не имеет уникального ограничения.Вы можете установить столбец id как автоинкремент и снова запустить миграцию:

Users

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