web-dev-qa-db-ja.com

SQLiteをLaravelで動作させる方法

_php artisan migrate_を実行するたびに、コンソールに次のエラーが表示されます。

[PDOException]
SQLSTATE [HY000] [14]データベースファイルを開けません

database.sqliteファイルはdatabase /にあります。私はWindows 10Laravel 5.2を実行しています。これは。envファイルの設定です:

。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バグですか?または何か誤解しましたか?

16
Alexander Lomia

ショートソリューション

質問には答えていませんが、"Database not found"の問題を修正する方法は、database.phpの次の行を置き換えることです。

'database' => env('DB_DATABASE', database_path('database.sqlite')),

'database' => database_path('database.sqlite'),
16
Alexander Lomia

.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')),
15
mutasaki

私たちの友人@ alexander-lomiaによるオーナーの補完

変更:

'database' => env('DB_DATABASE', database_path('database.sqlite'))

To:

'database' => database_path(env('DB_DATABASE'))

in database.php

:)

6
Gabriel Almeida

相対パスの代わりに、.envファイルで絶対パスを使用する必要があります。

DB_DATABASE=/var/www/project/database/database.sqlite

またはあなたの場合:

DB_DATABASE=D:\www\project\database\database.sqlite
2
Josh Hartman

これは、Laravel 5.5

  1. .envファイルでは、接続名のみを持ち、他のすべてのDB_関連設定を削除します:DB_CONNECTION=sqlite_testing

  2. config/database.phpファイルでsqlite設定を定義します。

    'connections' => [
    
        'sqlite_testing' => [
            'driver' => 'sqlite',
            'database' => database_path('testing-db.sqlite'),
            'prefix' => '',
        ],
    
        ...
    ]
    

私のファイルはdatabase/testing-db.sqliteにあります。

1
Raghavendra N

あなたと同じ問題がありました。 ENVファイルでabsoluteパスを使用する必要があります。

これに関する公式ドキュメントを確認してください https://laravel.com/docs/5.4/database

DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite
1
Diego Reinoso

最短で最も簡単な解決策は、.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
1
Rahi