_php artisan migrate
_を実行するたびに、コンソールに次のエラーが表示されます。
[PDOException]
SQLSTATE [HY000] [14]データベースファイルを開けません
database.sqliteファイルはdatabase /にあります。私はWindows 10、Laravel 5.2を実行しています。これは。envファイルの設定です:
_DB_CONNECTION=sqlite
DB_Host=127.0.0.1
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=Homestead
DB_PASSWORD=secret
_
私はあらゆるところを見てきましたが、このエラーの原因と解決方法を見つけることができませんでした。
。envファイルで_DB_DATABASE=database
_を_DB_DATABASE=database/database.sqlite
_に置き換えることで、移行を正常に実行できました。ただし、データベースからアイテムを取得しようとするたびに新しいエラーが発生します。
_public function index()
{
// cause of the error
$cards = Card::all();
return view('cards.index', compact('cards'));
}
_
上記のアクションは次のエラーをスローします。
SQLiteConnector.php行34のInvalidArgumentException:
データベース(database/database.sqlite)は存在しません。
奇妙なことに、コマンドCard::all()
は_php artisan tinker
_モードで問題なく動作します。それはどんな魔法ですか?
とにかく、私はまた行を見つけました:
_'database' => env('DB_DATABASE', database_path('database.sqlite')),
_
indatabase.phpファイルはdatabase_path('database.sqlite')
とすべてが正常に動作し始めるに置き換える必要があります。
問題の根本はenv('DB_DATABASE')
呼び出しであるようです。 SQLiteConnector.phpファイルに移動し、env('DB_DATABASE')
とdatabase_path('database.sqlite')
の両方の出力をダンプしました。それぞれの出力は次のとおりです。
_dd(env('DB_DATABASE')) // => 'database/database.sqlite'
dd(database_path('database.sqlite')) // => 'D:\www\project\database\database.sqlite'
_
ご覧のように、出力は異なります。2番目の出力は予想されるものです。これはLaravelバグですか?または何か誤解しましたか?
質問には答えていませんが、"Database not found"の問題を修正する方法は、database.phpの次の行を置き換えることです。
'database' => env('DB_DATABASE', database_path('database.sqlite')),
と
'database' => database_path('database.sqlite'),
.envファイルには次のものが含まれている必要があります。
DB_DATABASE = ..\database\database.sqlite
いくつかのテストを行うと、DB_DATABASEに含まれるリンクが(少なくとも私のWindowsマシンでは) 'public'ディレクトリに関連していることを確認できます。そのため、リンクの前に.. \を導入する必要があります。
そしてもちろん、絶対リンクを使用してもそれを行う必要があります
DB_DATABASE = D:\ www\project\database\database.sqlite
@Joshが示唆するように
.envファイルには次のものが含まれている必要があります。
DB_DATABASE=..\database\database.sqlite
いくつかのテストを行うと、DB_DATABASEに含まれるリンクが(少なくとも私のWindowsマシンでは) 'public'ディレクトリに関連していることを確認できます。そのため、リンクの前に.. \を導入する必要があります。
そしてもちろん、絶対リンクを使用してもそれを行う必要があります
DB_DATABASE=D:\www\project\database\database.sqlite
@Joshが示唆するように
相対パスを使用すると、プロジェクトディレクトリをルートディレクトリとして使用するため、移行が失敗します...
すべてを修正するには、次の設定をお勧めします。
DB_DATABASE=database\database.sqlite
config/database.phpのsqlite接続を次のように調整します。
'database' => env('DB_DATABASE/..', database_path('database.sqlite')),
私たちの友人@ alexander-lomiaによるオーナーの補完
変更:
'database' => env('DB_DATABASE', database_path('database.sqlite'))
To:
'database' => database_path(env('DB_DATABASE'))
in database.php
:)
相対パスの代わりに、.env
ファイルで絶対パスを使用する必要があります。
DB_DATABASE=/var/www/project/database/database.sqlite
またはあなたの場合:
DB_DATABASE=D:\www\project\database\database.sqlite
これは、Laravel 5.5
.envファイルでは、接続名のみを持ち、他のすべてのDB_
関連設定を削除します:DB_CONNECTION=sqlite_testing
config/database.php
ファイルでsqlite設定を定義します。
'connections' => [
'sqlite_testing' => [
'driver' => 'sqlite',
'database' => database_path('testing-db.sqlite'),
'prefix' => '',
],
...
]
私のファイルはdatabase/testing-db.sqlite
にあります。
あなたと同じ問題がありました。 ENVファイルでabsoluteパスを使用する必要があります。
これに関する公式ドキュメントを確認してください https://laravel.com/docs/5.4/database
DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite
最短で最も簡単な解決策は、.envのデフォルトのmysql設定を削除し、database.phpで作業することです。少なくとも私にとってはうまくいった。
以下を削除してください...
DB_CONNECTION=mysql
DB_Host=127.0.0.1
DB_PORT=3306
DB_DATABASE=Homestead
DB_USERNAME=Homestead
DB_PASSWORD=secret