CQL 最初是 BaDaaS 的一部分,它允許輕鬆安全地持久化和查詢物件。
它建立在 gorm 之上,gorm 是一個實際上提供 ORM 功能的函式庫:將物件對應到 SQL 資料庫中的表。雖然 gorm 透過自動遷移很好地完成了這項工作,但對這些物件執行查詢有些限制,迫使我們在複雜時直接編寫 SQL 查詢。 CQL 試圖透過一個查詢系統來解決這些限制:
語言 | 詢問 |
---|---|
SQL | 選擇城市。 INNER JOIN 國家 ON 國家/地區.id = 城市.國家/地區 ID AND 國家.名稱=“法國” WHERE 城市.name = "巴黎" |
戈爾姆 | db.Where( "城市.名稱 = ?", “巴黎”, ). 加入( “國家”, db.Where( "國家.名稱 = ?", “法國”, ), ).查找(&城市) |
CQL | cql.Query[模型.城市]( 分貝, conditions.City.Name.Is().Eq("巴黎"), 條件.城市.國家( conditions.Country.Name.Is().Eq("法國"), ), ).FindOne() |
確實,其目標似乎是相同的:
100% 類型安全的 DAO API,無介面{}
儘管 gorm-gen 提供了比 gorm 更結構化的 API 來執行查詢,但提供了以下方法:
Where ( conds ... gen . Condition ) IUserDo
從這個簽章我們可以看出,例如,Where 方法接收 gen.Condition 類型的參數。透過這種方式,來自不同模型的條件可以混合而不會產生編譯錯誤:
u := query . User
c := query . Company
user , err := u . Where ( c . Name . Eq ( "franco" )). First ()
這會在執行產生的 SQL 期間產生執行階段錯誤:
SELECT * FROM `users` WHERE `companies`.`name` = "franco"
no such column: companies.name
因此,cql 決定在類型安全性方面更進一步,檢查條件是否屬於正確的模型、比較的值是否屬於同一類型、模型是否包含在查詢中等等,以確保不會出現執行時間錯誤不會提高。
https://compiledquerylenguage.readthedocs.io/en/latest/
請參閱本節以查看 cql 貢獻指南。
CQL 根據 Mozilla 公共授權版本 2.0 授權。