使用Scala在Play中编写SQL?

时间:2014-05-25 22:26:45

标签: sql scala orm playframework

我正在查看Play框架的文档,看起来好像是SQL is being written in the framework

来自Rails,我知道这是一种不好的做法。主要是因为开发人员需要在扩展时切换数据库。

Play中允许开发人员实现约定和使用数据库而不必硬编码SQL的做法是什么?

3 个答案:

答案 0 :(得分:4)

Play中的一个功能/缺陷(取决于您询问的人)是没有ORM 。 (ORM是一个对象关系映射器/映射;它是Rails,Django等的一部分,为您编写SQL。)

  • Pro-ORM:您不必编写任何SQL。

    • 易于使用:一些不熟悉SQL的开发人员会发现这更容易。

    • 代码重用:表通常基于您的类;代码重复较少。

    • 可移植性:ORM尝试平滑DMBS供应商之间的任何差异。

  • No-ORM:你可以编写自己的SQL,而不是依靠看不见的ORM(黑色)魔法。

    • 性能:我为一家生产高流量Web应用程序的公司工作。有数百万访问者,您需要知道完全您正在运行的查询,完全您使用的是什么标记。否则,在dev中运行良好的代码将导致生产崩溃。

    • 灵活性:ORM通常没有像SQL这样的特定于域的语言所具有的完整表达范围。使用ORM很难/不可能编写一些更复杂的子选择和聚合查询。

    • 虽然您可能认为"开发人员需要在扩展数据库时切换数据库,但如果您扩展到足以改变DBMS,更改查询语法将是您可扩展性最小的问题。通常,必须重写查询本身以使用分片等,此时ORM已经死亡。

这是一种权衡;根据我的经验,我常常不喜欢ORM。

请参阅Anorm页面了解Play决定的理由:

  

您不需要其他DSL来访问关系数据库

     

SQL已经是访问关系数据库的最佳DSL。我们不需要发明新的东西。

     

...


Play开发人员通常会编写自己的SQL(与其他语言编写的方式大致相同,如HTML),使用Anorm,并遵循常见的SQL约定。

如果要求可移植性,请仅使用ANSI SQL(没有特定于供应商的特征)。它通常得到很好的支持。


编辑:或者如果你真的心胸开阔,你可能会看看NoSQL数据库,比如Mongo。它们本质上是基于对象的,因此面向对象的Ruby / Python / Scala可以自然地用作API。

答案 1 :(得分:2)

除了Paul Draper的优秀答案之外,这篇文章还是要告诉你Play开发人员通常在实践中做些什么。

TL; DR:use Slick

Play比Rails更不自觉,并为用户提供了更多的数据存储后端选择。许多人将Play用作非常复杂的现有后端系统的Web层。许多人将Play与NoSQL存储后端(例如MongoDB)一起使用。然后还有人使用Play进行传统的Web服务与SQL应用程序。概括一点,可以识别两个人使用Play与关系数据库。

"传统的网络开发者" 它们用于标准Java技术或是使用它们的组织的一部分。 Java Persistence API及其实现(Hibernate,EclipseLink等)是他们的ORM。你也可以这样做。似乎还有Scala ORMs,但我对这些不太熟悉。

请注意,与Rails'相比,Java / Scala ORM在样式中仍然是不同的ORM ActiveRecord的。 Ruby是一种动态语言,允许/促进猴子修补和method_missing内容的加载,因此有MyObject.finder_that_I_didnt_necessarily_have_to_write_myself()。这种ORM称为active record pattern。这种风格在纯Java中无法实现,在Scala中不鼓励(因为它违反了类型安全性),所以你必须习惯使用服务层和数据访问对象来编写更传统的风格。

" Scala网站开发人员" 许多Scala人认为ORM是a bad abstraction for database access。他们也同意使用原始SQL是一个坏主意,并且抽象仍然是有序的。幸运的是,Scala是一种富有表现力的编译语言,人们已经找到了一种抽象数据库访问的方法,它不像ORM那样依赖于面向对象语言范例,但主要是基于函数式语言范式。这与Microsoft为其.NET框架语言所做的LINQ查询语言完全相似。核心思想是,您没有ORM来执行查询魔术,也没有在SQL中编写查询,而是在 Scala本身中编写它们。这种方法的优点有两个方面:

  1. 与ORM相比,您可以更精细地控制查询实际执行的内容。
  2. Scala编译器会检查查询的有效性,因此您不会因自己编写的无效SQL而获得运行时错误。如果它是有效的Scala,则会将其转换为有效的SQL语句。
  3. 存在两个用于实现此目的的主要库。第一个是Squeryl。第二个是Slick。 Slick似乎是最受欢迎的一个,并且网上有一些示例,展示了如何使它与Play一起使用。另请查看this video作为Slick的介绍,并将其与ORM方法进行比较。

答案 2 :(得分:1)

FWIW,几个月前我写了short summary of the state of database access in Scala。我个人发现使用Slick结合其简单的SQL查询功能非常方便。