mysql - Rails 3 MySQL 2 报告看起来有效的 SQL 语法错误

标签 mysql ruby-on-rails rake mysql2

我正在尝试使用以下代码来帮助为我的数据库播种。我需要在开发过程中不断添加数据,并且不想每次向 seeds.rb 文件添加新内容时都必须重新播种数据。所以我添加了以下函数来插入数据,如果它不存在的话。

def AddSetting(group, name, value, desc)
    Admin::Setting.create({group: group, name: name, value: value, description: desc}) unless Admin::Setting.find_by_sql("SELECT * FROM admin_settings WHERE group = '#{group}' AND name = '#{name}';").exists?
end

AddSetting('google', 'analytics_id', '', 'The ID of your Google Analytics account.')
AddSetting('general', 'page_title', '', '')
AddSetting('general', 'tag_line', '', '')

此函数包含在 db/seeds.rb 文件中。这是执行此操作的正确方法吗?

但是,当我尝试通过 rake 运行它时出现以下错误。

rake aborted!
Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group = 'google' AND name = 'analytics_id'' at line 1: SELECT * FROM admin_settings WHERE group = 'google' AND name = 'analytics_id';

Tasks: TOP => db:seed
(See full trace by running task with --trace)

Process finished with exit code 1

令我困惑的是,据我所知,我正在生成正确的 SQL。事实上,我的代码生成了 SQL 并将其传递给模型的 find_by_sql 函数,Rails 本身不能更改 SQL,是吗?

SELECT * FROM admin_settings WHERE group = 'google' AND name = 'analytics_id';

这些年来我写了很多 SQL,我在这里查看了类似的问题。也许我错过了什么,但我看不到。

最佳答案

"group"是一个关键字,因此您不能按原样将其用作标识符,您必须用反引号将其引用(至少对于 MySQL 而言):

SELECT *
FROM admin_settings
WHERE `group` = 'google'
  AND name    = 'analytics_id'

Rails/ActiveRecord 生成的任何 SQL 都将使用列名的引用版本,所以我猜你正在生成一些 SQL(或者只是 WHERE 子句的 SQL 片段)而忽略了引用列名.

我建议不要使用 group 作为列名,使用其他名称,这样您就不必担心代码中到处都是反引号。

关于mysql - Rails 3 MySQL 2 报告看起来有效的 SQL 语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12594144/

相关文章:

ruby-on-rails-3 - 如何在rails的后台运行rake任务

ruby-on-rails - 如何解决 rails 插件上的 rake 任务弃用问题?

ruby-on-rails - 将 api key 添加到 ActiveResource 中的每个请求

ruby-on-rails - 在命名空间 Rails 脚手架中生成正确的路径

ruby-on-rails - capybara ::ElementNotFound:无法找到 xpath "/html"

ruby-on-rails - Rake des 不知道如何构建任务 'compile' ,如何跟踪这个错误?

MySQL:从有序结果中选择

php - 如果记录编辑内容: SQL statement in PHP

php - 用php7.0编写动态调用mysql存储过程的函数

php - 如何获取注册邮箱的主键id