Rails 4 sql query interpretation with mysql or sqlite3
Rails 4 sql query interpretation with mysql or sqlite3
我在开发中使用 sqlite,在生产中使用 mysql。
一个相同的 SQL 查询在开发模式下工作正常,但在生产模式下执行时出错。
在 sqlite 中(有效!):
SELECT "events".* FROM "events" WHERE ("events"."id" = ? OR "events"."deadline" BETWEEN '2015-01-28 22:56:05.651383' AND '2016-01-28 22:56:05.651385'
在 mysql 中(不起作用):
SELECT `events`.* FROM `events` WHERE (`events`.`id` = OR `events`.`deadline` BETWEEN '2015-01-28 22:24:10.837686' AND '2016-01-28 22:24:10.837690')
错误信息:
ERROR -- : Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'OR `events`.`deadline` BETWEEN '2015-01-28 22:24:10.837686' AND '2016-01-28 22:2' at line 1: SELECT `events`.* FROM `events` WHERE (`events`.`id` = OR `events`.`deadline` BETWEEN '2015-01-28 22:24:10.837686' AND '2016-01-28 22:24:10.837690')
控制器操作代码
def edit
query = Event.unscoped.where( deadline: (Time.now)..(Time.now + 1.year), id: @booking.event_id )
@events = Event.where(query.where_values.inject(:or))
end
Mysql 漏掉了“?”签名,我不明白为什么。请帮忙!
首先,您应该在开发中使用与在生产中使用的相同的数据库。
其次,这不是执行 OR
查询的可靠方法,事实上它在 Rails 4.2 中不再有效,这要归功于适当的记录工作。
如果你想可靠地做OR
s,那么使用Arel,即:
e = Event.arel_table
@events = Event.where(e[:id].eq(@booking.event_id).or(e[:deadline].in(Time.now..Time.now + 1.year)))
在这篇优秀的文章中查看更多信息:http://radar.oreilly.com/2014/03/just-enough-arel.html
我在开发中使用 sqlite,在生产中使用 mysql。
一个相同的 SQL 查询在开发模式下工作正常,但在生产模式下执行时出错。
在 sqlite 中(有效!):
SELECT "events".* FROM "events" WHERE ("events"."id" = ? OR "events"."deadline" BETWEEN '2015-01-28 22:56:05.651383' AND '2016-01-28 22:56:05.651385'
在 mysql 中(不起作用):
SELECT `events`.* FROM `events` WHERE (`events`.`id` = OR `events`.`deadline` BETWEEN '2015-01-28 22:24:10.837686' AND '2016-01-28 22:24:10.837690')
错误信息:
ERROR -- : Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'OR `events`.`deadline` BETWEEN '2015-01-28 22:24:10.837686' AND '2016-01-28 22:2' at line 1: SELECT `events`.* FROM `events` WHERE (`events`.`id` = OR `events`.`deadline` BETWEEN '2015-01-28 22:24:10.837686' AND '2016-01-28 22:24:10.837690')
控制器操作代码
def edit
query = Event.unscoped.where( deadline: (Time.now)..(Time.now + 1.year), id: @booking.event_id )
@events = Event.where(query.where_values.inject(:or))
end
Mysql 漏掉了“?”签名,我不明白为什么。请帮忙!
首先,您应该在开发中使用与在生产中使用的相同的数据库。
其次,这不是执行 OR
查询的可靠方法,事实上它在 Rails 4.2 中不再有效,这要归功于适当的记录工作。
如果你想可靠地做OR
s,那么使用Arel,即:
e = Event.arel_table
@events = Event.where(e[:id].eq(@booking.event_id).or(e[:deadline].in(Time.now..Time.now + 1.year)))
在这篇优秀的文章中查看更多信息:http://radar.oreilly.com/2014/03/just-enough-arel.html