簡體   English   中英

使用mysql或sqlite3進行Rails 4 SQL查詢解釋

[英]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 ,則使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM