wake-up-neo.net

So machen Sie SQLite in Laravel

Bei jedem Ausführen von php artisan migrate wird der folgende Fehler in der Konsole angezeigt:

[PDOException]
SQLSTATE [HY000] [14] Datenbankdatei kann nicht geöffnet werden

Die Datei database.sqlite befindet sich unter database/. Ich lasse Windows 10 , Laravel 5.2 . Hier ist .env file config:

.env:

DB_CONNECTION=sqlite
DB_Host=127.0.0.1
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=Homestead
DB_PASSWORD=secret

Ich habe überall gesucht, konnte aber nicht finden, was diesen Fehler verursacht und wie er behoben werden kann.

Aktualisieren

Es ist mir gelungen, Migrationen erfolgreich auszuführen, indem DB_DATABASE=database durch DB_DATABASE=database/database.sqlite in der Datei .env ersetzt wurde. Immer wenn ich versuche, Elemente aus der Datenbank abzurufen, tritt ein neuer Fehler auf:

public function index()
{
    // cause of the error
    $cards = Card::all();

    return view('cards.index', compact('cards'));
}

Die obige Aktion löst den folgenden Fehler aus:

InvalidArgumentException in SQLiteConnector.php-Zeile 34:
Datenbank (Datenbank/Datenbank.sqlite) ist nicht vorhanden.

Das Merkwürdige ist, dass der Befehl Card::all() im php artisan tinker-Modus einwandfrei funktioniert. Was für eine Magie ist das?

Wie auch immer, ich habe auch herausgefunden, dass die Zeile:

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

in database.php file muss nur durch database_path('database.sqlite') ersetzt werden und alles beginnt normal zu funktionieren .


Es scheint, dass die Wurzel des Problems der Aufruf von env('DB_DATABASE') ist. Ich ging in die Datei SQLiteConnector.php und zog die Ausgabe von env('DB_DATABASE') und database_path('database.sqlite') aus. Hier sind jeweils ihre Ausgänge:

dd(env('DB_DATABASE'))               // => 'database/database.sqlite'
dd(database_path('database.sqlite')) // => 'D:\www\project\database\database.sqlite'

Wie Sie sehen, unterscheidet sich ihre Ausgabe, und die zweite ist, was erwartet wird. Ist das ein Laravel Fehler? Oder habe ich etwas missverstanden?

13
Alexander Lomia

Kurze Lösung

Obwohl die Frage nicht beantwortet wird, besteht die Möglichkeit, das Problem mit "Datenbank nicht gefunden" zu beheben, in der folgenden Zeile in database.php zu ersetzen:

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

mit 

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

Die .env-Datei sollte Folgendes enthalten:

DB_DATABASE = ..\database\database.sqlite

Mit einigen Tests können Sie überprüfen, ob der in DB_DATABASE Enthaltene Link relativ zum 'öffentlichen' Verzeichnis ist (zumindest auf meinem Windows-Computer). Deshalb sollten wir ..\vor Ihrem Link einführen.

Die Verwendung eines absoluten Links sollte es natürlich auch tun

DB_DATABASE = D:\www\project\database\database.sqlite 

wie @Josh vorschlägt

Die .env-Datei sollte Folgendes enthalten:

   DB_DATABASE=..\database\database.sqlite

Mit einigen Tests können Sie überprüfen, ob der in DB_DATABASE Enthaltene Link relativ zum 'öffentlichen' Verzeichnis ist (zumindest auf meinem Windows-Computer). Deshalb sollten wir ..\vor Ihrem Link einführen.

Die Verwendung eines absoluten Links sollte es natürlich auch tun

   DB_DATABASE=D:\www\project\database\database.sqlite 

wie @Josh vorschlägt

Aktualisieren

Durch die Verwendung des relativen Pfads schlagen Migrationen fehl, da sie das Projektverzeichnis als Stammverzeichnis verwenden.

Um alles zu korrigieren, schlage ich Folgendes vor:

   DB_DATABASE=database\database.sqlite

und optimieren Sie die sqlite-Verbindungen in config/database.php wie folgt:

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

Ergänzend zur Antwort von unserem Freund @ Alexander-Lumia

Änderung:

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

an:

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

in database.php

:)

6
Gabriel Almeida

Anstelle eines relativen Pfads müssen Sie einen absoluten Pfad in Ihrer .env-Datei verwenden.

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

oder in deinem Fall:

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

Das hat für mich in Laravel 5.5 funktioniert

  1. In der .env-Datei müssen Sie nur den Verbindungsnamen angeben und alle anderen DB_-bezogenen Einstellungen entfernen: DB_CONNECTION=sqlite_testing

  2. Definieren Sie Ihre sqlite-Einstellungen in der config/database.php-Datei:

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

Meine Datei befindet sich im database/testing-db.sqlite.

1
Raghavendra N

Die kürzeste und einfachste Lösung besteht darin, die Standardeinstellungen für mysql in .env zu entfernen und in database.php zu arbeiten. Das hat zumindest für mich funktioniert. 

Entfernen Sie die folgenden ...

DB_CONNECTION=mysql
DB_Host=127.0.0.1
DB_PORT=3306
DB_DATABASE=Homestead
DB_USERNAME=Homestead
DB_PASSWORD=secret
1
Rahi

Ich habe das gleiche Problem wie du. Sie müssen den Pfad absolute in der ENV-Datei verwenden.

Bitte überprüfen Sie die offizielle Dokumentation zu dieser https://laravel.com/docs/5.4/database

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