【问题标题】:Creating mysql function from rails migration从 Rails 迁移创建 mysql 函数
【发布时间】:2017-04-29 13:22:20
【问题描述】:

我正在关注 This Post 并尝试通过 rails 迁移添加 levenshtein mysql 功能,如下所示:

class AddLevenshteinFunctionToMysql < ActiveRecord::Migration
  def self.up
    ActiveRecord::Base.connection.execute <<-SQL
      DELIMITER $$
      CREATE FUNCTION levenshtein( s1 VARCHAR(255), s2 VARCHAR(255) )
      RETURNS INT
      DETERMINISTIC
      .
      .
      .
    SQL
  end

  def self.down
    ActiveRecord::Base.connection.execute <<-SQL
      DROP FUNCTION levenshtein;
    SQL
  end
end

但是,我收到如下错误:

Mysql2::Error: 你的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本以获得正确的语法 在 'DELIMITER $$

附近使用

当我直接在 MySQL 控制台中尝试时,确切的代码运行良好。但我想通过 rails 迁移添加它。怎么了?

编辑

如果我删除 DELIMITER,则会出现以下错误(第 39 行是 END$$)

Mysql2::Error: 你的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本以获得正确的语法 在第 39 行使用 near ''

编辑

我得到了一个很好的答案来解释错误的原因,但不是修复。 ANSWER

【问题讨论】:

  • 只需删除DELIMITTERs和$$

标签: mysql ruby-on-rails migration


【解决方案1】:

Rails 无法执行 DELIMITER,因为它是一个 MYSQL 命令。

ActiveRecord 设置了不同的语句结束标志(不是分号),所以你可以直接写 sql, 只需删除 DELIMITTER$$

【讨论】:

    【解决方案2】:

    好的,我找到了答案。要回答我的问题,正如POST 中正确建议的那样,

    Rails 无法执行 DELIMITER,因为它是一个 MYSQL 命令

    因此,删除 DELIMITER $$ 并将 END$$ DELIMITER ; 替换为 END,解决了我的问题。

    所以最终的代码是这样的:

    class AddLevenshteinFunctionToMysql < ActiveRecord::Migration
      def self.up
        ActiveRecord::Base.connection.execute <<-SQL
          #DELIMITER $$  <-- removed
          CREATE FUNCTION levenshtein( s1 VARCHAR(255), s2 VARCHAR(255) )
          RETURNS INT
          DETERMINISTIC
          .
          .
          .
          END IF;
          RETURN c;
          #END$$  <-- removed
          #DELIMITER ;  <-- removed
          END
        SQL
      end
    

    【讨论】:

    • 这正是@TonyVincent 所建议的。也许你应该选择他的答案是正确的,这样他就会得到一些因果报应。
    • @JoshuaPinter 我做了更多的额外工作并给出了一个工作示例,这是 Tony 没有建议的。对于他的业力,我为他投了赞成票。
    • 由您决定,但一般来说,作为感谢您花时间理解您的问题并提供正确且有用的答案的人,您希望选择他们(而不是您自己)作为正确答案。如果可以添加其他信息,最好只编辑他们的正确答案并添加其他信息,而不是创建您自己的答案。对我来说,托尼文森特的回答很成功,在他的回答中添加一个工作示例将是正确的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多