it-swarm.dev

Comment faire fonctionner SQLite dans Laravel

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:

.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.

Mettre à jour

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?

13
Alexander Lomia

Solution courte

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'),
14
Alexander Lomia

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

Mettre à jour

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')),
13
motia

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

:)

6
Gabriel Almeida

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
2
Josh Hartman

Cela a fonctionné pour moi dans Laravel 5.5

  1. 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

  2. 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.

1
Raghavendra N

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
1
Rahi

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
0
Diego Reinoso