PostgreSQLからMySQLへの置き換えとXAMPP(MySQL)でPostgreSQLを使う方法。

はじめに

PostgreSQLからMySQLへの置き換え(マイグレーションファイル)とXAMPP(MySQL)でPostgreSQLを使う方法についてまとめました。

動機

問題は下記の教材で起きました。教材はDocker(PostgreSQL)での開発です。

私はXampp(MySQL)で試したので置き換える必要があったからです。

【感想】Laravel(+Vue.js)でSNS風Webサービスを作ろう!を終えて

※以下、当時ハマった際の投稿。

※ご自身の教材などに置き換えて参考にしていただければ幸いです。

PostgreSQLからMySQLへの置き換え

以下が解決法です。

解決策

PostgreSQLからMySQLに置き換えるには外部キー制約関連で違いがあり、負の値の無い数値型にするのがポイントです。

具体的にはMySQLでは、外部キーとなる数値項目にはunsigned;(負の値のない数値型)を付けることで解消します。

マイグレーションファイルを以下のように編集。

$table->bigIncrements('id');
$table->string('title');
$table->text('body');
$table->bigInteger('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
$table->timestamps();

原因

そもそもなぜこのような原因が起きたか。以下記事参考。

【メモ】【Laravel】外部キー制約付きMigrateがさっぱり動かないときのチェック・ポイント(Mysql)

increments()で作ったカラムには、裏でunsined(符号無し)属性が付与される。

要は自動採番項目なので正の値しか登録できないわけだが、役割テーブル側のuser_idauthority_idには同様の制約を付けていない。

つまり、外部キー側でも正の値しか登録できないようにunsigned();を付けて形式を一致させる必要があったとのこと。

補足

unsigned()を付けて、php artisan migrateで以下のようなエラーが出た場合。

パターン①

SQLSTATE[HY000]: General error: 1005 Can't create table `laravel_vue_sns`.`articles` (errno: 150 "Foreign key constraint is
key (`user_id`) references `users` (`id`))

laravel_vue_sns.articlesを作成できません(errno:150″外部キー制約はキー( user_id)はusersid)を参照します)

パターン②

SQLSTATE[HY000]: General error: 1005 Can't create table `laravel_vue_sns`.`articles` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter tarticles` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `articles` add constraint `articles_user_id_foreign` foreign key (`user_id`) references `users` (`id`))

laravel_vue_sns.articlesを作成できません(errno:150″外部キー制約の形式が正しくありません “)(SQL:alter tarticles(errno:150"外部キー制約が正しくありません (SQL:変更テーブルarticles制約の追加 articles_user_id_foreign外部キー(user_id)参照 usersid`))

解決法

phpMyAdmin側でDBを完全に消せているか確認すること。

どうやら一度migrateでエラーが出るとmigrate:rollbackしてもテーブルは残ってしまうことがあるみたいです。

その際はコマンドではなくphpMyAdmin側でテーブルをdropしてからmigrateをやり直せば解決します。

XAMPPでPostgreSQLを使う方法

以下からはXAMPPでPostgreSQLを使う形に挑戦してみました。

参考:XamppとPostgreSQLの連携 ⇒ PHPファイルからPostgreSQLまでのつなぎ方が記載されています。

ざっくりこんな内容です。

その後、Laravelに紐づけるためには.envファイルを編集する必要があります。

DB_CONNECTION=pgsql
DB_HOST=localhost
DB_PORT=5432
DB_DATABASE=test
DB_USERNAME=postgres
DB_PASSWORD=secret(ここはご自身で設定したパスワードを記載してください。)

僕の場合はこんな感じです。

別途、データベースを用意する必要があるのでデータベースを作成。

psql -U postgres -c "create database test;

その後、マイグレーション。

無事、マイグレーションすることができました。

おわりに

以前書いた記事を修正しました。

これでもちょっとわかりづらいかもしれないので、ちょっとずつ改良していきます。。。

知識不足の状態で記事書くとめちゃくちゃなこと書いてたりするから骨が折れる。。。

参考

当時嘆いていたところやんばるさん(著者)から解決策をご教授いただきました。

本当にありがとうございました。

Laravel5.8は、マイグレーションスタブの主キーのデフォルトが、increments()からbigIncrements()になった

コメントを残す