Update
Play 2.0的Scala版本将以ANORM为特色,这与Querulous类似,因为它们都是JDBC包装器而不是ORM . 这是使用解析器组合器的ANORM查询强制:
SQL("""
select * from Country c
join CountryLanguage l on l.CountryCode = c.Code
where c.code = 'FRA';
"""
).as(
str("name") ~< spanM(
by=str("code"), str("language") ~< str("isOfficial")
) ^^ {
case country~languages =>
SpokenLanguages(
country,
languages.collect { case lang~"T" => lang } headOption,
languages.collect { case lang~"F" => lang }
)
} ?
)
多行查询“”“sql”“”很好,我喜欢,但强制,请,没有;-)在Groovy中,使用相同查询的bean强制是1-liner:
List[Country] c = sql.rows("select * from country")?.collect{ it.toRowResult() as Country }
在groovy中的null安全操作符(?.might-be-null)非常方便,scala似乎需要Some()Option []组合来处理可能的null结果 . Scala编码器是否像Scala中的空值处理一样?
我想这篇文章的主要内容是:Scala能否在保留编译器类型安全代码的同时提供脚本语言的简洁性?鉴于Scala可能比C#(无意识的火焰)更强大/更具表现力,那么一个完整的Scala LINQ必须是可能的 . 此外,由于Scala跨越了功能和OO范例,因此它还必须能够实现Groovy级别的简洁(例如,上面的1-liner query-bean-coercion) .
如果这些假设成立,那么为什么现有的scala ORM和jdbc包装器需要如此多的样板文件而不是C#上的groovy和LINQ?显然,我是一个寻找裸机DSL的理想主义者,其实现要么非常简洁,要么密切反映它们所代表的底层语言(如在LINQ-to-SQL中) .
Original
一直在浏览各种Scala ORM(squeryl,daomapper,其他人将在后面填写)和SQL帮助框架(到目前为止很乱)
作为Scala的新手和一般的强类型语言,有一点是我需要在每个查询结果中指定每列的类型(String,Int等) .
即将在这里上过夜火车,但这件事让我很震惊,所以把它放在那里(当我再次回到网上时,会添加一些例子,使这有点不那么絮絮叨叨)
现在,来自Querulous在github上的自述文件中的快速内容:
val users = queryEvaluator.select("SELECT * FROM users WHERE id IN (?) OR name = ?", List(1,2,3), "Jacques") { row =>
new User(row.getInt("id"), row.getString("name"))
}
虽然我理解编译器需要知道你使用的每个“对象”的类型,但是当域类本身已经声明id为的时,必须指定“row.getInt('id')”似乎非DRY . 类型Int .
因此,出于相当程度的无知,我会问,为什么Scala ORM和SQL辅助框架不为开发人员提供允许推断或隐式结果集的实现模型?
只是为了放入上下文,我来自Grails,它有一个非常好的域/验证模型和其他框架之间的好东西,但遭受动态语言时间浪费胖手指键入(启动时间也很痛苦) )这就是我探索Scala框架的原因 .
1 回答
请参阅Scala Integrated Query,据我了解,它已计划作为Scala语言集成连接套件(SLICK)集成在typesafe stack中