我剛剛將我的應用程序從MySQL過渡到Postgres。以前,.all的請求以id順序返回了所有行。在Postgres上,這些行是不按順序返回的。同樣,帶Postgres數據的Rails無序返回
Person.first
用於返回ID爲1的記錄,現在它有時會返回另一條記錄。
如果我添加訂單條款是這樣的:
Person.order("id").first
查詢成功,返回的第一行。這是預期的行爲?
我剛剛將我的應用程序從MySQL過渡到Postgres。以前,.all的請求以id順序返回了所有行。在Postgres上,這些行是不按順序返回的。同樣,帶Postgres數據的Rails無序返回
Person.first
用於返回ID爲1的記錄,現在它有時會返回另一條記錄。
如果我添加訂單條款是這樣的:
Person.order("id").first
查詢成功,返回的第一行。這是預期的行爲?
this post回答你的問題:
我不認爲通過ID排序默認情況下保證的,因爲我相信這是給非有序查詢如何被返回的數據庫。你可以把它可以通過在模型的頂部像這樣定義了默認的範圍,以便下令:
default_scope order('id ASC')
然後調用Model.all將相當於調用Model.order(「ID ASC」)。
默認範圍將稍後在查詢鏈中覆蓋其他範圍。這不是我的首選解決方案。 – superluminary
另一種方法是創建一個範圍,這樣你就可以使用Person.by_id.first – blamattina
我想那就是那麼走了。謝謝 – superluminary
「讓我感覺很骯髒」,有一個已知的順序(從您的應用程序中刪除一個錯誤)vs隨機排序(並保持錯誤)??? –
默認情況下,MySQL通過id命令。這是一個明智的假設。 – superluminary
我認爲它是InnoDB,它通過主鍵命令作爲其實現的副作用。其他存儲引擎的行爲有所不同,我不確定甲骨文會否保證未來訂購保持不變。除非明確要求結果集排序,否則SQL標準非常明確。 –