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

时间:2017-09-30 22:36:19

标签: sql database laravel migration

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

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

有没有办法用laravel工匠迁移系统做到这一点?

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

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

2 个答案:

答案 0 :(得分:1)

是的,可以创建使用原始SQL

的迁移

您不仅限于可以在迁移中运行的代码。 Run raw SQL queries使用数据库外观。此示例显示了在同一迁移中使用的两种方法。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>

<video id="video" data-setup-lazy="{&quot;language&quot;: &quot;en&quot;, &quot;fluid&quot;: true}" class="video-js" preload="auto" controls="true" title="Export Compliance">
  <source src="http://localhost/pluginfile.php/myvideo.mp4" type="video/mp4">
  <a class="mediafallbacklink" href="http://localhost/pluginfile.php/myvideo.mp4">Video Source</a>
</video>

答案 1 :(得分:1)

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

  • 复杂模式,
  • 利用供应商特定的SQL扩展(DDL和DML)
  • 更丰富/其他数据类型
  • 使用供应商特定的过程代码(即PostgreSQL中的PL / pgSQL匿名块)

尽管有一种方法可以在Laravel迁移中执行原始SQL,但是即使使用heredoc也可以在变量中编写和管理原始SQL代码是痛苦且不自然的。

完全免责声明:这是一个无耻的插件

最近,我创建了一个实验包laravel-sql-migrations,用于我的项目中,以提取原始SQL执行的详细信息,并允许像在Liquibase或Windows XP中一样在*.sql文件中编写和保留SQL迁移。飞路。

该程序包还扩展了make:migrationmake:model命令,以便您可以使用熟悉的工作流程

php artisan make:migration create_users_table --sql

php artisan make:model User --migration --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_06_15_000000_create_users_table.php,除非您想要配置或覆盖此特定迁移的行为(即,如果数据库支持DDL,例如PostgreSQL,则设置特定的连接和/或使用事务)

如果您不使用反向/向下迁移,则可以删除相应的*.down.sql文件。

如果您要使用PostgreSQL,则这是标准Laravel users表的迁移的样子

-- 2018_06_15_000000_create_users_table.up.sql
CREATE TABLE IF NOT EXISTS users (
    id BIGSERIAL PRIMARY KEY,
    name CITEXT,
    email CITEXT,
    password TEXT,
    remember_token TEXT,
    created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
);
CREATE UNIQUE INDEX IF NOT EXISTS users_email_idx ON users (email);
-- 2018_06_15_000000_create_users_table.down.sql
DROP TABLE IF EXISTS users;