-1

我有一个 CRON 作业,它执行一个 SELECT 语句来获取记录。当 SELECT 在我的开发机器上运行时,它会生成以下语句:

SELECT `users`.* FROM `users` WHERE `users`.`id` = 87 LIMIT 1  

这是成功的。

当 SELECT 在我的生产(托管)机器上运行时,它会生成带有双引号的语句:

SELECT "users".* FROM "users" WHERE "users”.”id” = 87 LIMIT 1

这不成功,我收到 MySQL 1064 错误,

#1064 - 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 '.* FROM "users" WHERE "users

两台机器上的代码相同,但我的开发 MySQL 版本是 5.5.33,而生产版本是 5.1.67(我无法控制它来设置/更新它)

有没有办法强制单引号或其他首选方法来处理这种情况?

感谢您的时间和帮助。

- 编辑 -

以下是通过我的 CRON 作业调用的主要代码片段:

/lib/tasks/reports.rake

namespace :report do
  desc "Send Daily Report"
  task :daily => :environment do
    User.where(:report_daily => 1).find_each do |user|
      ReportsMailer.send_report(user, 'daily').deliver
    end
  end

/app/mailers/reports_mailer.rb

def send_report(user, date_increment)
   @user = user
   @date_increment = date_increment
   get_times(user)
   mail :to => user.email, :subject=> "Report: #{@dates}"
 end

--EDIT2--

所以看起来我需要使用倾斜的单引号(`)才能使它成功工作。如何强制我的应用程序或 MySQL 使用这些而不是双 (") 引号?

4

4 回答 4

1

我不知道为什么会这样,但我知道如果你在 MYSQL 中引用列名,你需要使用 ``,而值/数据应该用 "" 包裹,如下所示:

SELECT `users`.* FROM `users` WHERE `users`.`id` = "87" LIMIT 1 

在我学习如何进行简单的 MYSQL 查询的那天,我很难学会这一点

以下是MYSQL 网站上为您提供的一些文档:

标识符引号字符是反引号(“`”):

mysql> SELECT * FROM `select` WHERE `select`.id > 100;

如果您引用标识符,则标识符引号字符可以包含在标识符中。如果要包含在标识符中的字符与用于引用标识符本身的字符相同,则需要将该字符加倍。以下语句创建一个名为 a`b 的表,其中包含一个名为 c"d 的列:

mysql> CREATE TABLE `a``b` (`c"d` INT);
于 2013-10-27T18:23:01.477 回答
0

是否有任何理由不能将某些 sql 语句直接放入代码中,例如:

User.where("`report_daily`=1").find_each do |user|
于 2013-10-30T03:33:52.333 回答
0

经过进一步检查并与我的托管公司合作后,事实证明我的查询在他们的服务器上超时。感谢所有回复。

于 2013-10-30T12:11:35.150 回答
0

由于您没有使用任何文字,因此生成的 SQL 语句的格式应由底层适配器确定。也许您在每台机器上安装或配置了不同的 mysql 适配器。检查安装的版本。例如:

bundle show mysql

并在 database.yml 中检查项目的适配器配置。例如:

adapter: mysql

每台机器之间的这些检查结果的比较应该告诉您是否在两台机器上使用不同的适配器。

于 2013-11-05T17:54:42.590 回答