Как заставить 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
.