Laravel迁移-是否可以使用SQL而不是模式命令来创建表和字段等?

Laravel迁移-是否可以使用SQL而不是模式命令来创建表和字段等?,sql,database,laravel,migration,Sql,Database,Laravel,Migration,我们有一个现有的复杂数据库模式,包括索引、约束、触发器、表等 使用liquibase,您可以指向变更集中的纯sql文件,这可能是第一次(初始模式创建)迁移时整个DB的转储 class AddColumnsToUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema

我们有一个现有的复杂数据库模式,包括索引、约束、触发器、表等

使用liquibase,您可以指向变更集中的纯sql文件,这可能是第一次(初始模式创建)迁移时整个DB的转储

class AddColumnsToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('name');
            $table->string('age');
            $table->timestamps();
        });

        DB::update('update users set age = 30 where name = ?', ['John']);
    }
}
有什么办法可以通过laravel artisan迁移系统做到这一点吗

我们希望使用SQL语言进行所有数据库更新(因为我们已经知道了,而且我们只会使用mysql),但需要框架(迁移或liquibase)以正确的顺序应用更改等(因此他们会在数据库上记录已应用的更改等)

如果没有,是否有人将Liquibase与laravel一起使用?唯一的问题是它无法读取.env db连接字符串,每个开发人员都需要安装Liqbase(不是世界末日,但如果laravel内置系统可以使用sql,这将节省我们的时间和精力)

是的,可以创建使用原始sql的迁移 您不局限于可以在迁移中运行的代码。使用DB facade。此示例显示了在同一迁移中使用的两种方法

class AddColumnsToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('name');
            $table->string('age');
            $table->timestamps();
        });

        DB::update('update users set age = 30 where name = ?', ['John']);
    }
}

我相信在某些情况下使用原始/普通SQL迁移有很多好处

  • 复杂模式
  • 利用特定于供应商的SQL扩展(DDL和DML)
  • 更丰富/更多的数据类型
  • 使用特定于供应商的过程代码(即PostgreSQL中的PL/pgSQL匿名块)
尽管在Laravel迁移中有一种执行原始SQL的方法,但即使使用
herdoc
在变量中编写和管理原始SQL代码也是痛苦和不自然的

完整免责声明:这里有一个无耻的插头

最近,我创建了一个实验包,我在项目中使用它来抽象原始SQL执行的细节,并允许在
*.SQL
文件中编写和保存SQL迁移,就像在Liquibase或Flyway中一样

该软件包扩展了
make:migration
make:model
命令,以便您可以使用熟悉的工作流

php artisan make:迁移创建用户表--sql 或

php artisan make:模型用户--迁移--sql 这将产生三个文件

database └── migrations ├── 2018_06_15_000000_create_users_table.down.sql ├── 2018_06_15_000000_create_users_table.php └── 2018_06_15_000000_create_users_table.up.sql
--2018\u 06\u 15\u 000000\u创建用户\u table.down.sql
如果存在用户,则删除表;

谢谢你,利奥。我知道我们可以手动创建模式(我们现在正在这样做),但对于自动化部署,最好使用一个工具(例如artisan migrate或liquidise)来创建/更新数据库。另外,我们希望使用sql进行额外的迁移,并使用迁移框架来管理订单。那么,我是否可以编写一个函数来读取指定的SQL文件,并将其作为脚本(而不是单个语句)执行?DB::update在这种情况下不起作用,因为我将传入一长串语句,包括create table、create index、drop tables、create columns等。这就是我们需要处理DB和类似sql脚本文件转储的内容。是的,我看不出您为什么不能这样做。然而,与使用Laravel为您做这件事相比,这是您想要做这件事的一个特殊原因吗?根据我的经验,它最终比原始SQL更简洁、更易于阅读。我有一个400表的数据库SQL转储-将其从现有SQL格式转换为模式命令需要几天时间,而且可能没有1:1映射+大量错误空间。归根结底,我们知道SQL和Mysql,但我们不知道laravel用来创建SQL的语言。如果迁移不是设计为与原始SQL脚本(与原始SQL命令相反)一起使用,那么看起来应该是liquibase。请参阅:干得好,我正在处理一个维护不当的Laravel项目。这有助于我将所有现有迁移整合到一个系统中。现在我可以重新开始了!