为什么laravel 5 artisan迁移不创建sqlite数据库?

时间:2016-07-01 11:34:40

标签: php sqlite laravel laravel-5 artisan

我正在尝试使用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 migratesqlite创建laravel 5数据库的?

通过工匠创建mysql表格没有问题。

由于

4 个答案:

答案 0 :(得分:3)

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

touch database/database.sqlite

然后像这样配置环境变量

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

答案 1 :(得分:1)

为了回答OP的这一部分问题: “有什么想法可以让工匠迁移以在laravel 5中创建sqlite数据库吗?”

在某些情况下,需要对部署和迁移进行脚本编写,我使用Service Provider来检查Sqlite数据库是否存在,如果没有创建,请使用。

以下是步骤:

1)创建一个提供程序并将其保存到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)将以下内容添加/替换为'connections'的{​​{1}}元素

config/database.php

4)在我的'sqlite' => [ 'driver' => 'sqlite', 'database' => env('DB_SQLITE_FILEPATH', database_path('database.sqlite')), 'prefix' => '', 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), ], 文件中添加以下内容:

.env

...但是,如果您愿意,可以跳过此步骤,数据库将创建为DB_SQLITE_FILEPATH=/full/path/to/mysqlitefilename.sqlite

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

答案 2 :(得分:0)

是的,您需要创建一个空的database.sqlite文件。

如果您希望技术人员加载具体的.env文件,则还应该使用artisan --env参数。例如,artisan --env=testing migrate将迫使技术人员加载.env.testing文件。

答案 3 :(得分:-1)

好的我明白了。 artisan migrate似乎忽略了env DB_CONNECTION和database.php默认值(无论如何都会读取env)。相反,它像.env文件DB_CONNECTION一样,设置为sqlite它的工作原理(另外,如上所述,你需要手动创建数据库文件,这对于制作dbs很痛苦在飞行中。

也意味着您无法动态更改工匠迁移数据库类型(即:sqlitemysql),因为每次更改时都需要更改.env变量目标数据库类型。

去拉拉维尔。