我有一个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
两台机器上的代码相同,但我的dev 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使用这些而不是双(“)引号?
答案 0 :(得分:1)
我不知道为什么它会这样做,但我知道如果你在MYSQL中引用列名,你需要使用``,而值/数据应该包含在“”,像这样:
SELECT `users`.* FROM `users` WHERE `users`.`id` = "87" LIMIT 1
在我学习如何进行简单的MYSQL查询的那一天,我学到了很多东西
以下是MYSQL's site的一些文档:
标识符引号字符是反引号(“`”):
mysql> SELECT * FROM `select` WHERE `select`.id > 100;
标识符引号字符可以包含在标识符中 你引用标识符。如果要包含的字符 标识符与用于引用标识符本身的标识符相同, 那么你需要加倍角色。以下语句创建 一个名为a`b的表,其中包含一个名为c“d:
的列
mysql> CREATE TABLE `a``b` (`c"d` INT);
答案 1 :(得分:0)
有没有理由你不能将你的一些sql语句直接放入你的代码中,如:
User.where("`report_daily`=1").find_each do |user|
答案 2 :(得分:0)
经过进一步检查,并与我的托管公司合作,结果证明我的查询是在他们的服务器上超时。感谢所有回复。
答案 3 :(得分:0)
由于您没有使用任何文字,因此生成的SQL语句的格式应由底层适配器确定。也许你在每台机器上安装或配置了不同的mysql适配器。检查已安装的版本。例如:
bundle show mysql
并在database.yml中检查项目的适配器配置。例如:
adapter: mysql
每台机器之间的这些检查结果的比较应告诉您是否在两台机器上使用不同的适配器。