CQL 最初是 BaDaaS 的一部分,它允许轻松安全地持久化和查询对象。
它构建在 gorm 之上,gorm 是一个实际上提供 ORM 功能的库:将对象映射到 SQL 数据库中的表。虽然 gorm 通过自动迁移很好地完成了这项工作,但对这些对象执行查询有些限制,迫使我们在复杂时直接编写 SQL 查询。 CQL 试图通过一个查询系统来解决这些限制:
语言 | 询问 |
---|---|
SQL | 选择城市。* FROM 城市 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 获得许可。