ruby-on-rails-3
  • postgresql
  • heroku
  • 2012-07-13 85 views 1 likes 
    1

    我在Heroku上放了一個應用程序,它在本地運行良好(使用sqlite3作爲測試數據庫的gem),當我推到Heroku並嘗試運行時,我不斷收到錯誤:Heroku + Rails + PostgreSQL問題

    ActiveRecord::StatementInvalid (PG::Error: ERROR: syntax error at or near "order" 
    LINE 1: ...lery_url_id = 'k19fv2mytjEb_3gCezLeRA') ORDER BY `order` ASC               ^
    : SELECT "pictures".* FROM "pictures" WHERE (gallery_url_id = 'k19fv2mytjEb_3gCezLeRA') ORDER BY `order` ASC): 
    app/controllers/galleries_controller.rb:38:in `show' 
    

    具體地在這條線:

    @pictures = Picture.find(:all, :conditions => [ 'gallery_url_id = ?', @gallery.url_id ], :order => "`order` ASC") 
    

    注:順序是一個數據庫字段,而不是一個SQL調用或參考。所以不要告訴我我正在做兩個訂單。那會很愚蠢。除非它以某種方式被解析。這也將是愚蠢的。

    我知道這是在生產環境中在本地測試和PostgreSQL(pg)中使用SQLite的一些問題。我的問題是我需要做些什麼來解決這個問題?這是否是由於我在調用只有SQLite而不支持PostgreSQL的查找中調用的標誌?

    +0

    這裏有限的PG知識,但你試過[訂單]而不是'訂單'? – 2012-07-13 17:34:30

    +0

    做了這個,唯一被修改的是它現在是一個語法順序,處理「[」所以我猜這是一個失敗的嘗試:/ – user1470511 2012-07-13 17:39:53

    +0

    @DominicGoulet:這是一個SQL服務器主義,雙引號是標準語法。 – 2012-07-13 17:44:30

    回答

    7

    用於引用標識符的反引號是SQLite也支持的MySQL-ism。該標準語法(這PostgreSQL使用)用於引用標識符是用雙引號:

    :order => '"order" ASC' 
    

    我建議您儘快做兩件事情儘可能:

    1. 更改您的"order"的名字列的東西,而不是保留。
    2. 安裝PostgreSQL並使用PostgreSQL進行開發,您正在計劃部署到Heroku。您的開發堆棧應始終與您的部署堆棧完全匹配。

    第二點非常重要。數據庫的可移植性是一個神話,數據庫之間有如此多的小差異,編寫在多個數據庫中工作相同的代碼很困難,並且意味着編寫自己的可移植層(並且不,ActiveRecord不是可移植層)。這個小問題可能是許多小問題中的第一個。

    +2

    根據我的經驗,在SQLite和Postgres之間轉換特別困難。 SQLite有很多奇怪的小怪癖,特別是在列打字時,Postgres對類型相當嚴格。 – Emily 2012-07-13 17:55:33

    +1

    @Emily:是的,這可能和它一樣糟糕:SQLite超級鬆散,PostgreSQL超級嚴格。 – 2012-07-13 18:30:06

    相關問題