Laravelよくわかってない人がmake:migrationしてIlluminate/Database/QueryException with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'dbnm.tablenm' doesn't exist (SQL: insert into `tablenm` (`text`) values (Insert))'

Laravelよくわかってない人がmake:migrationしてテーブルがよびだせるか確認してQueryExceptionをくらった。

$ php artisan tinker
>>> DB::table('tablenm')->get();

■ 返答

Illuminate/Database/QueryException with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'dbnm.tablenm' doesn't exist (SQL: insert into tablenm (text) values (Insert))'

ざっくりテーブルまたはビューがないとのこと。テーブルがないだって!!

環境はMac El capitan、MySQL5.6 (ここが原因でした)

テーブルを確認する

「php artisan make:migration テーブル名 」で作っただけでは枠ができている状態で実際にMySQL上にテーブルができていないらしい。

MySQLでテーブルの確認をしてみる。

mysql -u user名 -p;
mysql> SHOW TABLES FROM DB_Name;

+-------------------+
| Tables_in_DB_Name|
+-------------------+
| migrations        |
| users             |
+-------------------+

作ったテーブルがいない。言われたとおりですね。

php artisan migrateする

php artisan migrateでテーブルが作成されるらしいので、実行。

php artisan migrate

長めの嫌なメッセージを受け取る。

Migrating: 2014_10_12_000000_create_users_table

Illuminate\Database\QueryException 

SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'users' already exists (SQL: create table `users` (`id` bigint unsigned not null auto_increment primary key, `name` varchar(255) not null, `email` varchar(255) not null, `email_verified_at` timestamp null, `password` varchar(255) not null, `remember_token` varchar(100) null, `created_at` timestamp null, `updated_at` timestamp null) default character set utf8mb4 collate 'utf8mb4_unicode_ci')

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671

    667|         // If an exception occurs when attempting to run a query, we'll format the error
    668|         // message to include the bindings with SQL, which will make this exception a
    669|         // lot more helpful to the developer instead of just the database's errors.
    670|         catch (Exception $e) {
  > 671|             throw new QueryException(
    672|                 $query, $this->prepareBindings($bindings), $e
    673|             );
    674|         }
    675| 
      +9 vendor frames 
  10  database/migrations/2014_10_12_000000_create_users_table.php:24
      Illuminate\Support\Facades\Facade::__callStatic("create")
      +22 vendor frames 
  33  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

とりあえず存在しているはずのusers テーブルが再実行されてしまい、もういるよと言っていると解釈。
自分が作ったmigrationには実行されなかったらしい。どうすれば実行されるのか。既存のファイル消し去ったらいいのかしら。

php artisan config:cache してみる

php artisan config:cacheでキャッシュを消してみる。変化なし。それもそうか。

とにかく自分で作ったmigrationを認識していないらしい。設定漏れっぽいな。

php artisan migrate:fresh してみる

php artisan migrate:fresh するとテーブルの中身とか全て消えるらしいけど、関係ないので実行。

Dropped all tables successfully.
Migration table created successfully.

Migrating: 2014_10_12_000000_create_users_table

   Illuminate\Database\QueryException 
  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))
  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671

    667|         // If an exception occurs when attempting to run a query, we'll format the error
    668|         // message to include the bindings with SQL, which will make this exception a
    669|         // lot more helpful to the developer instead of just the database's errors.
    670|         catch (Exception $e) {
  > 671|             throw new QueryException(
    672|                 $query, $this->prepareBindings($bindings), $e
    673|             );
    674|         }
    675| 
      +9 vendor frames 
  10  database/migrations/2014_10_12_000000_create_users_table.php:24
      Illuminate\Support\Facades\Facade::__callStatic("create")
      +34 vendor frames 
  45  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

Migrating: 2014_10_12_000000_create_users_tableでSyntaxエラーがあるらしい。php artisan migrate同じようなメッセージなので確認したほうが良さそう。
これのせいで、新しいmigrationの処理ができてないのかな。

MySQL5.6に対応させる ( 解決 )

上記のSyntaxエラーについて調べたところ、MySQLのバージョンによってSyntaxエラーになるそう。
MySQLのバージョンは5.6で変更することはMacのOS的にできないので以下のように対応。

ファイルのパス : app/Providers/AppServiceProvider.php

太字が追加箇所。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}

/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
Schema::defaultStringLength(191);
}
}

その他の対応方法や詳細は参考元を確認ください。
参考サイト: Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生するQitta

再びphp artisan migrate:fresh

php artisan migrate:fresh

■ 返答

Dropped all tables successfully.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.09 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.05 seconds)
Migrating: 2020_04_26_141842_作成したテーブル
Migrated:  2020_04_26_141842_作成したテーブル (0.04 seconds)

無事作成された模様。

念のためMySQLでテーブルの確認。

mysql -u user名 -p;
mysql> SHOW TABLES FROM DB_Name;

+-------------------+
| Tables_in_DB_Name|
+-------------------+
| failed_jobs       |
| migrations        |
| 追加したテーブル            |
| users             |
+-------------------+

おー増えた。

やりたかったコマンドの実施。

$ php artisan tinker
>>> DB::table('tablenm')->get();

■ 返答

=> Illuminate\Support\Collection {#3019
     all: [],
   }

おー。まだ何も入ってないからか。

値を追加。

>>> DB::table('tablenm')->insert(['id' => '001', "title" => 'test', "body" => 'tesybody'])

成功。ちなみに以下のようなtableデータ。

public function up()
{
Schema::create('tablenm', function (Blueprint $table)
{
$table->increments('id');
$table->string('title');
$table->text('body');
$table->timestamps();
});
}

際実施

>>> DB::table('tablenm')->get();

■ 返答

=> Illuminate\Support\Collection {#3022
     all: [
       {#3027
         +"id": 1,
         +"title": "test",
         +"body": "tesybody",
         +"created_at": null,
         +"updated_at": null,
       },
     ],
   }

おー。できた。

laravel, MySQL, php, SQL

Posted by Nakamoto