FunDA的特点之一是以数据流方式提供逐行数据操作支持。这项功能解决了FRM如Slick数据操作以SQL批次模式为主所产生的问题。为了实现安全高效的数据行操作,我们必须把FRM产生的Query结果集转变成一种强类型的结果集,也就是可以字段名称进行操作的数据行类型结果集。在前面的一篇讨论中我们介绍了通过Shape来改变Slick Query结果行类型。不过这样的转变方式需要编程人员对Slick有较深的了解。更重要的是这种方式太依赖Slick的内部功能了。我们希望FunDA可以支持多种FRM,所以应当尽量避免与任何FRM的紧密耦合。看来从FRM的返回结果开始进行数据行类型格式转换是一种比较现实的选择。一般来说我们还是可以假定任何FRM的使用者对于FRM的Query结果集类型是能理解的,因为他们的主要目的就是为了使用这个结果集。那么由FunDA的使用者提供一个Query结果数据行与另一种类型的类型转换函数应该不算是什么太高的要求吧。FunDA的设计思路是由用户提供一个目标类型以及FRM Query结果数据行到这个强类型行类型的类型转换函数后由FunDA提供强类型行结果集。下面先看一个典型的Slick Query例子:
1 import slick.driver.H2Driver.api._ 2 import scala.concurrent.duration._ 3 import scala.concurrent.Await 4 5 object TypedRow extends App { 6 7 class AlbumsTable(tag: Tag) extends Table[ 8 (Long,String,String,Option[Int],Int)](tag,"ALBUMS") { 9 def id = column[Long]("ID",O.PrimaryKey)10 def title = column[String]("TITLE")11 def artist = column[String]("ARTIST")12 def year = column[Option[Int]]("YEAR")13 def company = column[Int]("COMPANY")14 def * = (id,title,artist,year,company)15 }16 val albums = TableQuery[AlbumsTable]17 class CompanyTable(tag: Tag) extends Table[(Int,String)](tag,"COMPANY") {18 &nbs

