【问题标题】:why is laravel 5 artisan migrate not creating sqlite database?为什么 laravel 5 artisan migrate 不创建 sqlite 数据库?
【发布时间】:2016-11-03 19:23:16
【问题描述】:

我正在尝试使用artisan migratesqlite 中创建表。

我在database.php中有以下内容

    'sqlite' => [
        'driver' => 'sqlite',
        'database' => database_path('database.sqlite'),
        'prefix' => '',
    ],

这是我的迁移类 up 函数

    Schema::connection('sqlite')->create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });

注意:- 我已通过环境变量将 DB_CONNECTION 设置为 sqlite。

在命令行我得到nothing to migrate,并且没有创建数据库(也没有表)。

有什么想法可以让artisan migratelaravel 5 中创建sqlite 数据库吗?

我通过 artisan 创建 mysql 表没有问题。

谢谢

【问题讨论】:

  • artisan migrate:status 显示什么?
  • +------+---------------------- ----+ |冉? |迁移 | +--------+--------------------------------------------------+ |是 | 2014_10_12_000000_create_users_table | |是 | 2016_07_01_101905_create_test_table | +--------+--------------------------------------------------+

标签: php sqlite laravel laravel-5 laravel-artisan


【解决方案1】:

因为你没有创建数据库。使用 touch 这样的命令创建新的 sqlite 数据库。

touch database/database.sqlite

然后像这样配置环境变量

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

【讨论】:

  • 我应该提到我已经尝试过了,但它没有工作,除了 sqlite 创建一个 db 文件之外没有一个。
【解决方案2】:

为了回答这部分 OP 的问题: “任何想法如何让工匠迁移以在 laravel 5 中创建一个 sqlite 数据库?”

在某些需要编写部署和迁移脚本的情况下,我使用Service Provider 来检查 Sqlite DB 是否存在,如果不存在则创建它。

步骤如下:

1) 创建一个Provider并保存到app/Providers/SqliteServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class SqliteServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        $databaseFile = config('database.connections.sqlite.database');
        if (!file_exists($databaseFile)) {
            info('Make Sqlite File "' . $databaseFile . '"');
            file_put_contents($databaseFile, '');
        }
    }
}

2) 在config/app.php 中注册提供者。例如,在全新的 L5.8 安装中,SqliteServiceProvider 将被放置在 RouteServiceProvider 下,如下所示:

'providers' => [

    //...

    /*
     * Application Service Providers...
     */
    App\Providers\AppServiceProvider::class,
    App\Providers\AuthServiceProvider::class,
    // App\Providers\BroadcastServiceProvider::class,
    App\Providers\EventServiceProvider::class,
    App\Providers\RouteServiceProvider::class,
    App\Providers\SqliteServiceProvider::class, // <--- HERE

],

3) 将以下内容添加/替换到config/database.php'connections' 元素

'sqlite' => [
    'driver' => 'sqlite',
    'database' => env('DB_SQLITE_FILEPATH', database_path('database.sqlite')),
    'prefix' => '',
    'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],

4) 在我的.env 文件中添加:

DB_SQLITE_FILEPATH=/full/path/to/mysqlitefilename.sqlite

...但如果您愿意,可以跳过此步骤,数据库将创建为 database/database.sqlite

5) 像往常一样运行迁移,然后应该创建 sqlite 文件然后填充。

【讨论】:

    【解决方案3】:

    没错,你需要创建一个空的database.sqlite文件。

    如果您希望 artisan 加载具体的 .env 文件,您还应该使用 artisan --env 参数。例如,artisan --env=testing migrate 将强制 artisan 加载 .env.testing 文件。

    【讨论】:

    • 不错的自定义环境提示!
    【解决方案4】:

    好的,我明白了。 artisan migrate 似乎忽略了 env DB_CONNECTION 和 database.php 默认值(无论如何都会读取 env)。相反,它就像.env 文件DB_CONNECTION,将其设置为sqlite 它可以工作(另外,如上所述,您确实需要手动创建数据库文件,这对于动态创建dbs 来说很痛苦。

    还意味着您无法实时更改 artisan migrate 数据库类型(即:sqlitemysql),因为每次更改目标数据库类型时都需要更改 .env 变量。

    去拉拉维尔。

    【讨论】:

    • 为什么每次都要更改 .env 变量?您只需更改目标数据库,所有设置都将被拾取。您可以为数据库指定特定的变量名称。例如 DB_SQLITE_DATABASE、DB_PGSQL_DATABASE、DB_PGSQ_USERNAME 等
    猜你喜欢
    • 2014-02-16
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2017-10-03
    • 1970-01-01
    • 2015-04-14
    • 2017-01-07
    相关资源
    最近更新 更多