从doctrine raw sql创建mysql的问题

时间:2013-10-12 22:57:07

标签: mysql sql symfony doctrine procedure

我正在使用Symfony2中的应用程序项目。 通过注册,每个客户端创建一个数据库。 架构由客户端登录时由验证服务创建。 应用程序需要一些数据才能工作,到目前为止,我使用了ORM fixture。 出于多种原因,我现在需要从夹具加载移动到更接近数据库。 我创建了一个存储过程(mysql),它将替换所有数据加载。该过程有效,但我需要在每个数据库中与模式一起创建此过程。 我为此目的使用doctrine raw sql,但我无法通过create procedure语句的第一行传递问题。它似乎与'delimiter $$'有关。

使用sql语句执行服务时,我得到: “message”:“执行'delimiter $$ \ r \ n \ r \ n时发生异常\ n \ nRREATE DEFINER = root @`localhost”

这似乎是因为换行,但我不确定。有人知道某种方式吗?

3 个答案:

答案 0 :(得分:4)

问题来自于delimiter命令只能在使用所讨论的http://dev.mysql.com/doc/refman/5.1/en/stored-programs-defining.html的MySQL命令行工具时使用。要解决此问题,您需要删除更改分隔符的部分并使用;作为你的分隔符。请考虑以下事项:

  

delimiter $$

     

CREATE PROCEDURE dorepeat(p1 INT)

     

BEGIN

SET @x = 0;

REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
     

END $$

以上情况不会奏效:

  

CREATE PROCEDURE dorepeat(p1 INT)

     

BEGIN

SET @x = 0;

REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
     

END;

答案 1 :(得分:0)

您应该覆盖CREATE DEFINER,因为在您将启动过程的系统中,root @ localhost不是mysql或数据库用户。

答案 2 :(得分:0)

我知道这是一个迟到的答案,但这篇文章在Google的结果中很高,我在其他地方找不到其他答案,所以我想发布一个解决方案如何克服这个问题。

长话短说,一个人必须在查询中使用\ n字符打破行,例如:

$this->addSql(
    "CREATE EVENT event_example ON SCHEDULE EVERY 15 MINUTE ".
    "ON COMPLETION NOT PRESERVE ENABLE DO BEGIN\n".
    "INSERT INTO archives SELECT * FROM records;\n".
    "DELETE FROM records;\n".
    "END"
);