【发布时间】:2012-11-11 16:09:40
【问题描述】:
是否可以在迁移类中调用 .sql 文件?
我找不到关于该主题的任何内容。
【问题讨论】:
-
我不认为你可以。您应该在迁移后启动它。这个 sql 文件包含什么?
-
它创建存储过程和视图并且是动态创建的
标签: sql symfony1 doctrine symfony-1.4
是否可以在迁移类中调用 .sql 文件?
我找不到关于该主题的任何内容。
【问题讨论】:
标签: sql symfony1 doctrine symfony-1.4
是的,只需放入该 .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);
}
【讨论】:
;怎么办?它可能并不安全。可能是 ";\n" 应该更好。
$this->addSql(file_get_contents(__DIR__ . '/sql-dump.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
【讨论】:
对于我使用的 MySQLi:
$this->connection->getWrappedConnection()->getWrappedResourceHandle()->multi_query($sql);
【讨论】: