从 Rails 迁移创建 mysql 函数

Abh*_*bhi 4 mysql migration ruby-on-rails

我正在关注这篇文章并尝试通过 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
Run Code Online (Sandbox Code Playgroud)

但是,我收到如下错误:

Mysql2::Error: 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 'DELIMITER $$ 附近使用的正确语法

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

编辑

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

Mysql2::Error: 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在第 39 行附近使用的正确语法

编辑

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

Ton*_*ent 6

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

ActiveRecord 设置了一个不同的语句结束标志(不是分号),所以你可以直接写 sql,去掉DELIMITTER$$