Команда artisan db для работы с базами данных в Laravel
Команда artisan db и её назначение
Как запустить интерактивную консоль базы данных внутри Laravel?
Команда php artisan db открывает REPL (Read–Eval–Print Loop) для подключённой базы данных. Это удобный способ выполнять SQL‑запросы, просматривать структуру таблиц или тестировать соединение без обращения к сторонним клиентам. После ввода команды появится приглашение mysql> (или sqlite> / psql>) в зависимости от используемого драйвера.
php artisan dbPhp pdo sqlsrv (pdo для sql server)
После запуска консоль готова принимать любые запросы. Для выхода используется комбинация Ctrl+C или команда quit (для MySQL).
Как подключиться к определённой базе данных?
Если в проекте настроено несколько соединений (config/database.php), можно указать нужное через флаг --database:
php artisan db --database=mysql_legacyPhp artisan db (команда artisan db в laravel)
Команда откроет консоль для соединения mysql_legacy. Это полезно, когда требуется быстро переключаться между базами без ручного ввода параметров.
Как выполнить один запрос и сразу завершить сеанс?
Команда artisan db сама по себе не принимает SQL как аргумент, но можно передать запрос через стандартный ввод Unix:
echo "SELECT COUNT(*) FROM users;" | php artisan dbPhp pdo pgsql (pdo для postgresql)
Такой подход подходит для автоматизации (скрипты, CI/CD). Вывод будет содержать только результаты запроса.
Какие типичные ошибки возникают при работе с консолью?
Проблема: при запуске команды возникает ошибка "Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found" или не поддерживается драйвер. Решение: убедиться, что в проекте установлен пакет doctrine/dbal (требуется для некоторых команд, хотя для db это не обязательно, но может возникать при конфликте версий). Достаточно выполнить composer require doctrine/dbal.
Проблема: консоль открывается, но не отвечает на запросы. Частая причина - неправильная настройка соединения в .env или использование неподдерживаемого драйвера. Следует проверить, что драйвер (mysql, pgsql, sqlite) указан верно и сервер БД запущен.
Проблема: для SQLite консоль не отображает приглашение. Команда всё равно работает, но вывод может быть минимальным. Рекомендуется выполнить пару тестовых запросов, чтобы убедиться в работоспособности.
Как использовать консоль для отладки медленных запросов?
Внутри REPL можно включать профайлер и тайминги. Для MySQL используется команда SET profiling = 1;. После выполнения запроса SHOW PROFILES; покажет время выполнения. В PostgreSQL аналогичную роль играет \timing (доступно в psql).
mysql> SET profiling = 1;
mysql> SELECT * FROM orders WHERE total > 1000;
mysql> SHOW PROFILES;
Это позволяет анализировать производительность прямо из консоли Laravel.
Расширенные примеры работы с artisan db
Пример 1. Подключение к SQLite и выполнение нескольких запросов
# Предварительно создать базу (если не существует)
touch database/database.sqlite
# Запустить консоль, указав соединение sqlite
php artisan db --database=sqlite
Внутри консоли:
sqlite> CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT);
sqlite> INSERT INTO test VALUES (1, 'Alice');
sqlite> SELECT * FROM test;
1|Alice
Пример 2. Выполнение транзакции в консоли
php artisan db
mysql> START TRANSACTION;
mysql> UPDATE accounts SET balance = balance - 100 WHERE id = 1;
mysql> UPDATE accounts SET balance = balance + 100 WHERE id = 2;
mysql> COMMIT;
mysql> SELECT * FROM accounts;
В случае ошибки можно откатить командой ROLLBACK.
Пример 3. Передача SQL через конвейер с heredoc
# В Bash
db_query=$(cat <
Флаг --quiet подавляет лишние сообщения. Вывод содержит только результат запроса.
+-------------+----------+ | total_users | avg_age | +-------------+----------+ | 150 | 34.2000 | +-------------+----------+
Пример 4. Использование с PostgreSQL и просмотр плана запроса
php artisan db --database=pgsql
psql> EXPLAIN ANALYZE SELECT * FROM orders WHERE created_at > now() - interval '1 day';
Это показывает фактический план выполнения и затраты времени - полезно для настройки индексов.
Пример 5. Комбинирование с artisan tinker и DB фасадом
Хотя artisan db - это отдельная команда, иногда удобно выполнять сложные операции прямо в REPL базы. Но если требуется доступ к Eloquent, лучше использовать php artisan tinker. В db работа ведётся только на уровне SQL.
Пример 6. Автоматизация дампа схемы через консоль
echo "SHOW CREATE TABLE users;" | php artisan db | grep -A 20 "CREATE TABLE" > schema.sql
Позволяет получить DDL таблицы без использования сторонних утилит.