是否可以在迁移类中调用 .sql 文件?
我找不到关于该主题的任何内容。
是的,只需放置该 .sql 文件并从您的迁移类中引用它。
$this->addSql(file_get_contents(__DIR__ . '/sql-dump.sql'));
我知道这是一个老问题,但当我搜索它时,它仍然是唯一真正的成功。上面的答案可以稍微改进一下。这是一个简单的事情,但你可能不会想到它。如果你有一个 sql 文件,其中包含多个用分号分隔的查询,则可以将分号上的内容展开。
<?php
foreach (explode(';', file_get_contents(__DIR__ . '/sql-dump.sql')) as $sql) {
$this->addSql($sql);
}
对于 MySQLi,我使用了:
$this->connection->getWrappedConnection()->getWrappedResourceHandle()->multi_query($sql);
如果您正在使用 SQLite 并且想要执行一个包含多个用分号分隔的语句的 .sql 文件,我建议使用以下代码:
$this->connection->exec(file_get_contents(__DIR__ . '/sql-dump.sql'));
这是因为如果使用 addSql() 方法,Doctrine 将调用 query() 方法,该方法不支持单个字符串中的多个语句,并且只会执行第一个。仅 exec() 方法支持多个语句。请参阅:php.net/manual/en/function.sqlite-query.php