Как заставить SQLite работать в Laravel

Всякий раз, когда я запускаю php artisan migrate, в консоли отображается следующая ошибка:

[PDOException]
  SQLSTATE [HY000] [14] не удалось открыть файл базы данных

Файл database.sqlite находится в базе данных /. Я запускаю Windows 10, Laravel 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

Я смотрел повсюду, но не смог найти причину этой ошибки и как ее решить.

Update

Мне удалось успешно выполнить миграции, заменив DB_DATABASE=database на DB_DATABASE=database/database.sqlite в .env файле. Тем не менее, новая ошибка возникает всякий раз, когда я пытаюсь получить элементы из базы данных:

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

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

Вышеуказанное действие вызывает следующую ошибку:

InvalidArgumentException в строке SQLiteConnector.php 34:
База данных (database/database.sqlite) не существует.

Странно, что команда Card::all() работает безупречно в режиме php artisan tinker. Что это за магия?

В любом случае, я также узнал, что строка:

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

в файле database.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'

Как вы видите, их выход отличается, а второй - тем, что ожидается. Это ошибка Laravel? Или я что-то не понял?

Ответ 1

Краткое решение

Не отвечая на вопрос, способ исправить проблему "База данных не найдена" заключается в замене следующей строки в файле database.php:

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

с

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

Ответ 2

Файл .env должен содержать следующее:

DB_DATABASE =..\базы данных \database.sqlite

При тестировании вы можете проверить, что ссылка включена в DB_DATABASE относится к "общедоступному" каталогу (по крайней мере, на моей машине с Windows). Вот почему мы должны ввести..\перед вашей ссылкой.

И, конечно, использование абсолютной ссылки должно делать это тоже

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

как @Josh предлагает

Файл .env должен содержать следующее:

   DB_DATABASE=..\database\database.sqlite

При тестировании вы можете проверить, что ссылка включена в DB_DATABASE относится к "общедоступному" каталогу (по крайней мере, на моей машине с Windows). Вот почему мы должны ввести..\перед вашей ссылкой.

И, конечно, использование абсолютной ссылки должно делать это тоже

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

как @Josh предлагает

Update

Используя относительный путь, миграции будут терпеть неудачу, потому что они используют каталог проекта в качестве корневого каталога...

Чтобы исправить все, я предлагаю установить:

   DB_DATABASE=database\database.sqlite

и настройку соединений sqlite в config/database.php следующим образом:

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

Ответ 3

Дополняя тент нашим другом @alexander-lomia

Изменить:

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

To:

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

в database.php

:)

Ответ 4

Вместо относительного пути вам нужно использовать абсолютный путь в вашем файле .env.

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

или в вашем случае:

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

Ответ 5

Самое короткое и простое решение - удалить настройки mysql по умолчанию в .env и работать в database.php. Это то, что сработало для меня, по крайней мере.

Удалите следующее...

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

Ответ 6

У меня такая же проблема, как и у вас. Вы должны использовать абсолютный путь в файле ENV.

Пожалуйста, ознакомьтесь с официальной документацией об этом https://laravel.com/docs/5.4/database

DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite

Ответ 7

Это сработало для меня в Laravel 5.5

  • В файле .env просто укажите имя подключения и удалите все другие связанные с DB_ параметры: DB_CONNECTION=sqlite_testing

  • Определите свои настройки sqlite в файле config/database.php:

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

Мой файл находится в database/testing-db.sqlite.