【问题标题】:Is it possible to call a .sql file in a doctrine migration?是否可以在学说迁移中调用 .sql 文件?
【发布时间】:2012-11-11 16:09:40
【问题描述】:

是否可以在迁移类中调用 .sql 文件?

我找不到关于该主题的任何内容。

【问题讨论】:

  • 我不认为你可以。您应该在迁移后启动它。这个 sql 文件包含什么?
  • 它创建存储过程和视图并且是动态创建的

标签: sql symfony1 doctrine symfony-1.4


【解决方案1】:

是的,只需放入该 .sql 文件并从迁移类中引用它即可。

$this->addSql(file_get_contents(__DIR__ . '/sql-dump.sql'));

【讨论】:

  • 这是指教义1.2吗?我找不到这个选项:/
  • 如果 SQL 包含多个用分号分隔的查询怎么办?
  • ^ 它适用于包含的 SQL 文件中用分号分隔的多个查询(至少在 Symfony 3.x 中;很可能在 Symfony 2.8+ 中也适用......只是测试一下) .
  • 我不使用 SQLite,因为 Doctrine 调用 query() 方法,该方法不支持单个字符串中的多个语句,并且只会执行第一个语句。仅 exec() 方法支持多个语句。见:php.net/manual/en/function.sqlite-query.php
【解决方案2】:

我知道这是一个老问题,但当我用谷歌搜索它时,它仍然是唯一真正的成功。上面的答案可以稍微改进一下。这是一个简单的事情,但你可能不会想到它。如果你有一个包含多个查询的sql文件,用分号分隔,可以用分号展开内容。

<?php

foreach (explode(';', file_get_contents(__DIR__ . '/sql-dump.sql')) as $sql) {
    $this->addSql($sql);
}

【讨论】:

  • 如果sql查询里面会有;怎么办?它可能并不安全。可能是 ";\n" 应该更好。
  • 不需要这个,因为这个 ($this-&gt;addSql(file_get_contents(__DIR__ . '/sql-dump.sql'));) 在多个查询用分号分隔的情况下有效。
【解决方案3】:

如果你正在使用 SQLite 并且想要执行一个包含多个用分号分隔的语句的 .sql 文件,我建议使用以下代码:

$this->connection->exec(file_get_contents(__DIR__ . '/sql-dump.sql'));

这是因为如果使用 addSql() 方法,Doctrine 将调用 query() 方法,该方法不支持单个字符串中的多个语句,并且只会执行第一个。仅 exec() 方法支持多个语句。见:php.net/manual/en/function.sqlite-query.php

【讨论】:

    【解决方案4】:

    对于我使用的 MySQLi:

    $this->connection->getWrappedConnection()->getWrappedResourceHandle()->multi_query($sql);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 2016-01-03
      • 2012-01-22
      • 2017-04-09
      • 1970-01-01
      • 2022-07-08
      • 1970-01-01
      相关资源
      最近更新 更多