Chaque fois que j'exécute php artisan migrate
, l'erreur suivante apparaît dans la console:
[PDOException]
SQLSTATE [HY000] [14] impossible d'ouvrir le fichier de base de données
Le fichier database.sqlite se trouve dans database/. J'utilise Windows 10, Laravel 5.2. Voici la configuration du fichier .env:
DB_CONNECTION=sqlite
DB_Host=127.0.0.1
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=Homestead
DB_PASSWORD=secret
J'ai regardé partout, mais je ne pouvais pas trouver la cause de cette erreur et comment la résoudre.
J'ai réussi à réussir les migrations en remplaçant DB_DATABASE=database
par DB_DATABASE=database/database.sqlite
dans le fichier .env. Cependant, une nouvelle erreur se produit chaque fois que j'essaie de récupérer des éléments de la base de données:
public function index()
{
// cause of the error
$cards = Card::all();
return view('cards.index', compact('cards'));
}
L'action ci-dessus lève l'erreur suivante:
InvalidArgumentException dans SQLiteConnector.php ligne 34:
La base de données (database/database.sqlite) n'existe pas.
La chose étrange est que la commande Card::all()
fonctionne parfaitement en mode php artisan tinker
. Quel genre de magie est-ce?
Quoi qu'il en soit, j'ai aussi découvert que la ligne:
'database' => env('DB_DATABASE', database_path('database.sqlite')),
dans database.php, le fichier doit être remplacé par database_path('database.sqlite')
et tout commence à fonctionner normalement .
Il semble que la racine du problème soit l'appel env('DB_DATABASE')
. Je suis allé au fichier SQLiteConnector.php et ai vidé la sortie de env('DB_DATABASE')
et database_path('database.sqlite')
. Voici leurs sorties respectivement:
dd(env('DB_DATABASE')) // => 'database/database.sqlite'
dd(database_path('database.sqlite')) // => 'D:\www\project\database\database.sqlite'
Comme vous le voyez, leur résultat diffère et le second correspond à ce qui est attendu. Est-ce un bug de Laravel? Ou ai-je mal compris quelque chose?
Bien que ne répondant pas à la question, le moyen de résoudre "Base de données introuvable" est de remplacer la ligne suivante dans database.php :
'database' => env('DB_DATABASE', database_path('database.sqlite')),
avec
'database' => database_path('database.sqlite'),
Le fichier .env devrait contenir ceci:
DB_DATABASE = ..\database\database.sqlite
Avec certains tests, vous pouvez vérifier que le lien inclus dans DB_DATABASE est relatif au répertoire "public" (au moins sur ma machine Windows). C'est pourquoi nous devrions introduire ..\avant votre lien.
Et bien sûr, utiliser un lien absolu devrait le faire aussi
DB_DATABASE = D:\www\projet\base de données\base de données.sqlite
comme @Josh suggère
Le fichier .env devrait contenir ceci:
DB_DATABASE=..\database\database.sqlite
Avec certains tests, vous pouvez vérifier que le lien inclus dans DB_DATABASE est relatif au répertoire "public" (au moins sur ma machine Windows). C'est pourquoi nous devrions introduire ..\avant votre lien.
Et bien sûr, utiliser un lien absolu devrait le faire aussi
DB_DATABASE=D:\www\project\database\database.sqlite
comme @Josh suggère
En utilisant le chemin relatif, les migrations échoueront car elles utilisent le répertoire du projet comme répertoire racine ...
Pour tout corriger, je suggère de mettre:
DB_DATABASE=database\database.sqlite
et en peaufinant les connexions sqlite dans config/database.php comme suit:
'database' => env('DB_DATABASE/..', database_path('database.sqlite')),
En complément de notre ami @ alexander-lomia
Changement:
'database' => env('DB_DATABASE', database_path('database.sqlite'))
À:
'database' => database_path(env('DB_DATABASE'))
dans database.php
:)
Au lieu d'un chemin relatif, vous devez utiliser un chemin absolu dans votre fichier .env
.
DB_DATABASE=/var/www/project/database/database.sqlite
ou dans votre cas:
DB_DATABASE=D:\www\project\database\database.sqlite
Cela a fonctionné pour moi dans Laravel 5.5
Dans le fichier .env, indiquez simplement le nom de la connexion et supprimez tous les autres paramètres liés à DB_
: DB_CONNECTION=sqlite_testing
Définissez vos paramètres sqlite dans le fichier config/database.php
:
'connections' => [
'sqlite_testing' => [
'driver' => 'sqlite',
'database' => database_path('testing-db.sqlite'),
'prefix' => '',
],
...
]
Mon fichier est dans le database/testing-db.sqlite
.
La solution la plus simple et la plus simple consiste à supprimer les paramètres mysql par défaut dans .env et à travailler dans database.php. C'est ce qui a fonctionné pour moi au moins.
Supprimer ce qui suit ...
DB_CONNECTION=mysql
DB_Host=127.0.0.1
DB_PORT=3306
DB_DATABASE=Homestead
DB_USERNAME=Homestead
DB_PASSWORD=secret
J'ai le même problème que toi. Vous devez utiliser le chemin absolute dans le fichier ENV.
Veuillez vérifier la documentation officielle à ce sujet https://laravel.com/docs/5.4/database
DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite