Laravel迁移-是否可以使用SQL而不是模式命令来创建表和字段等?
我们有一个现有的复杂数据库模式,包括索引、约束、触发器、表等 使用liquibase,您可以指向变更集中的纯sql文件,这可能是第一次(初始模式创建)迁移时整个DB的转储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
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匿名块)
- 等
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项目。这有助于我将所有现有迁移整合到一个系统中。现在我可以重新开始了!