質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

解決済

テスト環境で発行されるSQL中の値部分がクォーテーションで囲われずに発行される

d-sazanami
d-sazanami

総合スコア10

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

2回答

0評価

0クリップ

315閲覧

投稿2022/03/11 03:19

編集2022/03/11 15:00

環境

OS等:Windows 10 WSL上のUbuntuのDockerにsailで構築
Laravel:v8.83.3
PHP:v8.1.3
データベース:MySQL 8.0

ソースコードgitリポジトリ

リポジトリ:https://github.com/d-sazanami/laravel-jissenkaihatsu-v1

備考

開発環境として.envを参照する環境、PHPUnitのテストをする用に.env.testingを参照する環境を構築
開発環境、テストする環境は、異なるデータベースを参照するよう設定した(・・・はず)

現象

発端の現象は、testing環境でseederを実行したところ、SQLSTATE[HY000] [2002] Connection refusedのエラーが発生。(詳細は後述)
調べた(内容は後述)結果、発行されるSQLのクォーテーションでくくって欲しい部分がくくられずに発行されている。なお、マイグレーションはtesting環境でも成功しており、MySQLのデータベースを直接見に行くと、データベース、テーブル共に存在し、testing環境でアクセスするMySQLユーザーからも見える。
この現象は、testing環境のみ発生し、defaultの環境では発生しない。

testing環境でseederを実行したことの詳細

ソースコード

seeder

php

<?php namespace Database\Seeders; use Illuminate\Database\Seeder; use Illuminate\Support\Facades\DB; class PersonSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { DB::table('people')->insert([ 'name' => '博麗霊夢', 'mail' => 'reimu@hakurei.com', 'age' => 16, ]); } }

env.testing

APP_ENV=testing APP_KEY=[.envと違うものを設定] APP_DEBUG=true APP_URL=http://localhost LOG_CHANNEL=stack LOG_LEVEL=debug DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=laravel_app_test DB_USERNAME=sail DB_PASSWORD=sail ~(略)~

phpunit.xml

xml

<?xml version="2.0" encoding="UTF-8"?> <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php" colors="true" > <testsuites> <testsuite name="Unit"> <directory suffix="Test.php">./tests/Unit</directory> </testsuite> <testsuite name="Feature"> <directory suffix="Test.php">./tests/Feature</directory> </testsuite> </testsuites> <coverage processUncoveredFiles="true"> <include> <directory suffix=".php">./app</directory> </include> </coverage> <php> <server name="APP_ENV" value="testing"/> <server name="BCRYPT_ROUNDS" value="4"/> <server name="CACHE_DRIVER" value="array"/> <server name="DB_CONNECTION" value="testing"/> <server name="DB_DATABASE" value="laravel_app_test"/> <server name="DB_USERNAME" value="sail"/> <server name="DB_PASSWORD" value="sail"/> <server name="MAIL_MAILER" value="array"/> <server name="QUEUE_CONNECTION" value="sync"/> <server name="SESSION_DRIVER" value="array"/> <server name="TELESCOPE_ENABLED" value="false"/> </php> </phpunit>

config/database.php

php

'connections' => [ 'sqlite' => [ 'driver' => 'sqlite', 'url' => env('DATABASE_URL'), 'database' => env('DB_DATABASE', database_path('database.sqlite')), 'prefix' => '', 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), ], 'mysql' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], 'pgsql' => [ 'driver' => 'pgsql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '5432'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, 'schema' => 'public', 'sslmode' => 'prefer', ], 'sqlsrv' => [ 'driver' => 'sqlsrv', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', '1433'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, ], 'testing' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => '127.0.0.1', 'port' => '3306', 'database' => 'laravel_app_test', 'username' => 'sail', 'password' => 'sail', 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ] ],

実行内容

bash

# php artisan db:seed --database=testing --class=PersonSeeder Illuminate\Database\QueryException SQLSTATE[HY000] [2002] Connection refused (SQL: insert into `people` (`name`, `mail`, `age`) values (博麗霊夢, reimu@hakurei.com, 16)) at vendor/laravel/framework/src/Illuminate/Database/Connection.php:712 708▕ // If an exception occurs when attempting to run a query, we'll format the error 709▕ // message to include the bindings with SQL, which will make this exception a 710▕ // lot more helpful to the developer instead of just the database's errors. 711▕ catch (Exception $e) { 712▕ throw new QueryException( 713$query, $this->prepareBindings($bindings), $e 714); 715} 716} +16 vendor frames 17 database/seeders/PersonSeeder.php:18 Illuminate\Database\Query\Builder::insert() +22 vendor frames 40 artisan:37 Illuminate\Foundation\Console\Kernel::handle()

調べたこと

マイグレーション状態確認

bash

# php artisan migrate:status +------+------------------------------------------------+-------+ | Ran? | Migration | Batch | +------+------------------------------------------------+-------+ | Yes | 2014_10_12_000000_create_users_table | 1 | | Yes | 2014_10_12_100000_create_password_resets_table | 1 | | Yes | 2019_08_19_000000_create_failed_jobs_table | 1 | | Yes | 2022_03_05_010816_create_people_table | 1 | | Yes | 2022_03_05_034018_add_age_to_people | 1 | | Yes | 2022_03_09_025533_create_jobs_table | 1 | +------+------------------------------------------------+-------+ # php artisan migrate:status --database=testing Illuminate\Database\QueryException SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = laravel_app_test and table_name = migrations and table_type = 'BASE TABLE') at vendor/laravel/framework/src/Illuminate/Database/Connection.php:712 708▕ // If an exception occurs when attempting to run a query, we'll format the error 709▕ // message to include the bindings with SQL, which will make this exception a 710▕ // lot more helpful to the developer instead of just the database's errors. 711▕ catch (Exception $e) { 712▕ throw new QueryException( 713$query, $this->prepareBindings($bindings), $e 714); 715} 716} +35 vendor frames 36 artisan:37 Illuminate\Foundation\Console\Kernel::handle()

MySQLの状態

sql

mysql> select * from information_schema.tables where table_schema = 'laravel_app_test' and table_name = 'migrations' and table_type = 'BASE TABLE'; +---------------+------------------+------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | ENGINE | VERSION | ROW_FORMAT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | AUTO_INCREMENT | CREATE_TIME | UPDATE_TIME | CHECK_TIME | TABLE_COLLATION | CHECKSUM | CREATE_OPTIONS | TABLE_COMMENT | +---------------+------------------+------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------------+ | def | laravel_app_test | migrations | BASE TABLE | InnoDB | 10 | Dynamic | 0 | 0 | 16384 | 0 | 0 | 0 | NULL | 2022-03-10 05:56:37 | NULL | NULL | utf8mb4_unicode_ci | NULL | | | +---------------+------------------+------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------------+ 1 row in set (0.00 sec)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

d-sazanami

2022/03/11 05:11

再度、マイグレーションを試みてみましたが、特に環境に変化はなさそうです。 ```bash # php artisan migrate:refresh --env=testing Rolling back: 2022_03_09_025533_create_jobs_table Rolled back: 2022_03_09_025533_create_jobs_table (276.29ms) Rolling back: 2022_03_05_034018_add_age_to_people Rolled back: 2022_03_05_034018_add_age_to_people (114.63ms) Rolling back: 2022_03_05_010816_create_people_table Rolled back: 2022_03_05_010816_create_people_table (29.54ms) Rolling back: 2019_08_19_000000_create_failed_jobs_table Rolled back: 2019_08_19_000000_create_failed_jobs_table (26.14ms) Rolling back: 2014_10_12_100000_create_password_resets_table Rolled back: 2014_10_12_100000_create_password_resets_table (21.38ms) Rolling back: 2014_10_12_000000_create_users_table Rolled back: 2014_10_12_000000_create_users_table (19.00ms) Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (113.85ms) Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table (83.39ms) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (115.00ms) Migrating: 2022_03_05_010816_create_people_table Migrated: 2022_03_05_010816_create_people_table (49.31ms) Migrating: 2022_03_05_034018_add_age_to_people Migrated: 2022_03_05_034018_add_age_to_people (41.13ms) Migrating: 2022_03_09_025533_create_jobs_table Migrated: 2022_03_09_025533_create_jobs_table (118.25ms) root@bdbeda4095bc:/var/www/html# php artisan migrate:status --database=testing Illuminate\Database\QueryException SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = laravel_app_test and table_name = migrations and table_type = 'BASE TABLE') at vendor/laravel/framework/src/Illuminate/Database/Connection.php:712 708▕ // If an exception occurs when attempting to run a query, we'll format the error 709▕ // message to include the bindings with SQL, which will make this exception a 710▕ // lot more helpful to the developer instead of just the database's errors. 711▕ catch (Exception $e) { ➜ 712▕ throw new QueryException( 713▕ $query, $this->prepareBindings($bindings), $e 714▕ ); 715▕ } 716▕ } +35 vendor frames 36 artisan:37 Illuminate\Foundation\Console\Kernel::handle() ```
d-sazanami

2022/03/11 05:54

testing環境へマイグレーションが適応されているか、確認するコマンドを変えて確認してみたところ、マイグレーションは成功しているようです ``` # php artisan migrate:status --env=testing +------+------------------------------------------------+-------+ | Ran? | Migration | Batch | +------+------------------------------------------------+-------+ | Yes | 2014_10_12_000000_create_users_table | 1 | | Yes | 2014_10_12_100000_create_password_resets_table | 1 | | Yes | 2019_08_19_000000_create_failed_jobs_table | 1 | | Yes | 2022_03_05_010816_create_people_table | 1 | | Yes | 2022_03_05_034018_add_age_to_people | 1 | | Yes | 2022_03_09_025533_create_jobs_table | 1 | +------+------------------------------------------------+-------+ ```

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。