Slick是一个FRM(Functional Relational Mapper),是为fp编程提供的scala SQL Query集成环境,可以让编程人员在scala编程语言里用函数式编程模式来实现对数据库操作的编程...在这篇讨论里我想以函数式思考模式来加深了解Slick。我对fp编程模式印象最深的就是类型匹配:从参数类型和返回结果类型来了解函数功能。...所以上面我所指的函数式思考方式主要是从Slick函数的类型匹配角度来分析函数所起的作用和具体使用方式。...从qInsert3产生的SQL语句来看:jdbc返回数据后还必须由Slick进一步处理后才能返回用户要求的结果值。...DBIOAction只是对数据库操作动作的描述,不是实际的读写,所以DBIOAction可以进行组合。所谓组合的意思实际上就是把几个动作连续起来。
FunDA的特点之一是以数据流方式提供逐行数据操作支持。这项功能解决了FRM如Slick数据操作以SQL批次模式为主所产生的问题。...为了实现安全高效的数据行操作,我们必须把FRM产生的Query结果集转变成一种强类型的结果集,也就是可以字段名称进行操作的数据行类型结果集。...在前面的一篇讨论中我们介绍了通过Shape来改变Slick Query结果行类型。不过这样的转变方式需要编程人员对Slick有较深的了解。更重要的是这种方式太依赖Slick的内部功能了。...下面先看一个典型的Slick Query例子: 1 import slick.driver.H2Driver.api._ 2 import scala.concurrent.duration._...下面我们要设计FunDA的数据行类型class FDADataRow。这个类型现在基本上完全是针对Slick而设的,成功完成功能实现后期再考虑松散耦合问题。
在上一集的讨论里我们介绍并实现了强类型返回结果行。使用强类型主要的目的是当我们把后端数据库SQL批次操作搬到内存里转变成数据流式按行操作时能更方便、准确、高效地选定数据字段。...那么在上篇中实现的流式操作基础上再添加一种指令行类型就可以完善整个数据处理流程了,就像下面这个图示: Database => Query -> Collection => Streaming -> DataRow...的类型就是Slick的DBIO[T]了: 1 package com.bayakala.funda.rowtypes 2 import slick.dbio._ 3 object ActionType...先用下面这段代码来设置测试数据: 1 import slick.dbio.DBIO 2 import slick.driver.H2Driver.api._ 3 4 import scala.concurrent.duration...这是因为foreach只能模拟最基本的数据流动。如果我们使用了具备强大功能的Stream工具库如scalaz-stream-fs2,就可以更好控制数据元素的流动。
首先谈谈Slick的特点:主体方面Slick为函数式编程模式带来了SQL编程,可以把数据库表当作scala语言中的集合来对待。...这样看来Slick的工作原理大体上是: 构建Query >>> 组合Query >>> 产生SQL语句 >>> 按流程把SQL语句发给数据库进行运算 >>> 获取结果 完成了上面的叙述后,总觉着好像缺少些什么...是了,Slick把jdbc的resultset隐藏起来了。其目的可以理解:这样可以实现语法安全(type safety),才能把SQL编程融入FP编程,即scala集合编程。...综合以上分析,如果从一个有多年信息管理系统(MIS)开发经验的程序员需求出发,能在工作中使用FRM是一种崭新的体验。与习惯用的ORM比较,从scala编程表达形式和程序运算方式上都有较大的改善。...真希望有心人能在Slick3.1的基础上增加一些特色功能,实现以下目标: 1、增加对resultset row的操作支持: a) 增加如row.next、row.addNew、row.update
在以前的博文中我们介绍了Slick,它是一种FRM(Functional Relation Mapper)。...所以我们只能从小众心态来探讨如何改善Slick现状,希望通过与某些Stream库集成,在Slick FRM的基础上恢复一些人们熟悉的Recordset数据库光标(cursor)操作方式,希望如此可以降低...刚好,在这篇讨论里我们希望能介绍一些Akka-Stream和外部系统集成对接的实际用例,把Slick数据库数据载入连接到Akka-Stream形成streaming-dataset应该是一个挺好的想法。...Slick和Akka-Stream可以说是自然匹配的一对,它们都是同一个公司产品,都支持Reactive-Specification。...下面是本次示范的源代码: import slick.jdbc.H2Profile.api._ import com.bayakala.funda._ import api._ import scala.language.implicitConversions
,其中交互必须如所描述的那样工作,由消费者uponReceiving执行的请求和预期的响应。...也可以在消费者(Consumer)处理的结果值上添加更多的检查(声明)。...我们差不多完成了我们想要的实现,它基本上是定义了actor系统和执行HTTP调用的函数的元素: MyLibraryAppClient.scala package com.fm.mylibrary.consumer.app...您可以在官方文档中找到更多关于如何在Slick中实现实体和DAO的示例和信息。...解决了如何在消费者和提供者项目之间共享契约验证结果的问题 告诉您可以将应用程序的哪个版本安全地部署在一起,自动地将您的合同版本部署在一起 允许您确保多个消费者版本和提供者版本之间的向后兼容性(例如,在移动或多租户环境中
同时考虑到所有HTTP元素必须匹配(方法,url,标题,正文和查询) 用于验证消费者契约的实际测试的定义: 此代码将针对以前的方案运行,虚拟服务器将响应 交互部分中定义的唯一HTTP请求(如果响应为deined...也可以在消费者(Consumer)处理的结果值上添加更多的检查(声明)。 当然,我们可以添加更多场景和交互。我们也可以为许多生产者定义更多的契约。...我们差不多完成了我们想要的实现,它基本上是定义了actor系统和执行HTTP调用的函数的元素: MyLibraryAppClient.scala 它是一个对象,所以我们可以将它导入到任何我们必须使用我们的客户端的地方...您可以在官方文档中找到更多关于如何在Slick中实现实体和DAO的示例和信息。...解决了如何在消费者和提供者项目之间共享契约验证结果的问题 告诉您可以将应用程序的哪个版本安全地部署在一起,自动地将您的合同版本部署在一起 允许您确保多个消费者版本和提供者版本之间的向后兼容性(例如,在移动或多租户环境中
具体来说Projection提供了数据库表列与Scala值的对应。...我们来看看Slick官方文件上的例子: import scala.reflect.ClassTag // A custom record class case class Pair[A, B...实际上Slick本身提供了Tuple、Case Class、HList等类型的默认Shape隐式实例,所以我们可以把Projection直接写成 def * = (...)...如果返回的结果类型是Seq[Person]这样的话:Person是个带属性的对象如case class,那么我们就可以通过IDE提示的字段名称来选择字段了。...类型就是Table[T]的T,也就是返回结果行的类型了。
ScalikeJDBC在覆盖JDBC基本功能上是比较完整的,而且实现这些功能的方式比较简洁,运算效率方面自然会稍高一筹了。...理论上用ScalikeJDBC作为一种JDBC-Engine还是比较理想的:让它处于各种JDBC工具库和数据库实例之间接收JDBC运算指令然后连接目标数据库进行相关运算后返回结果。...一般来说,各种JDBC工具库如ORM,FRM软件通过各自的DSL在复杂的数据库表关系环境内进行数据管理编程,最终产生相关的SQL语句即(prepared)statement+parameters传递给指定类型的数据库...JDBC驱动程序去运算并产生结果。...类型值,然后由jdbcRunSQL进行接下来的运算并返回结果。
现实场景如外层是多个数据库连接(connections),内层是多个客户端(clients)。...在前面我们已经掌握了用Slick来产生Stream[Task,FDAROW]的方法,例如: val albumStream1 = streamLoader.fda_typedStream(albumsInfo.result...我们同样可以把产生的ActionRow用并行的方法来运算: val runner = FDAActionRunner(slick.driver.H2Driver) //并行运算函数 def...:在startRun之前,我们可以任意进行函数组合,而且静态类型系统(static type system)会帮我们检查各组件的类型是否匹配。...下面是本篇讨论的示范源代码: package com.bayakala.funda.fdapars.examples import slick.driver.H2Driver.api._ import
刚接触Scala的同学,看到的基本上都是一些宣传性的文章,也因此对它有一些不太正确的观点。...然而这些库在scala中,要么用起来非常别扭,要么有一些奇怪的问题。而Scala原生的库,比如squeryl,slick等,都有“多利用类型系统,少做魔术”的追求,所以用起来总是不那么好用。...这是不是意味着,我们可以让项目中的一部分代码使用Java实现,另一部分使用Scala? 在理论上是可以的,并且在实际中,有的时候我们不得不这样。...甚至有可能为了学习scala而中途专门去学习另一门函数式语言(如haskell, lisp等),掌握了那些概念后,再回来看scala。...但是实际情况是,如果不能尽早的掌握足够的类型系统知识,在使用Scala时我们几乎寸步难行。我们在编译Scala代码时,遇到的最多错误就是各种类型不匹配,如果不熟悉的话,可能要卡几个小时都解决不了。
按一般的scala和akka的编程方式编写多线程分布式数据库管理软件时一是要按照akka代码模式,使用scala编程语言的一些较深的语法;二是需要涉及异步Async调用,集群Cluster节点任务部署及...[R,M]类型结果。...在PRG中流动的R类型可能是数据如数据库表的一行,又或者是一条Sring类型的query如plain-sql,可以用JDBC来运行。cassandra的CQL也是String类型的。...Slick,Quill,ScalikeJDBC和一些其它ORM的Query都可以产生plain-sql。 Source是一段程序的开始部分。...Sink的主要作用实际上是保证完全消耗程序中产生的所有元素,这是reactive类型程序的必须要求。 好了,不知不觉还有几个钟头就进入2017倒计时了。
中,可以把一个函数直接赋给一个变量,但是不执行函数,格式:函数名 _ 注意:本质上是将内存地址赋值给栈里面的变量!!! ...// 步骤 (4 - 5) // 步骤 (3- (4 - 5)) // 步骤 (2 -(3- (4 - 5))) // 步骤 1- (2 -(3- (4 - 5))) = 3 ...2、Scala 的 类型匹配 的快速入门案例 示例代码如下: package com.atguigu.chapter12.mymatch object MatchTypeDemo01 { def ...2、Scala 的 对象匹配 的快速入门案例 应用案例1示例代码如下: package com.atguigu.chapter12.mymatch object MatchObjectDemo01 ...2、匹配嵌套结构 的最佳实践案例-商品捆绑打折出售 现在有一些商品,请使用 Scala 设计相关的样例类,完成商品捆绑打折出售。要求: 1、商品捆绑可以是单个商品,也可以是多个商品。
模式匹配是许多函数编程语言的特征,允许从代数数据类型的潜在嵌套结构中提取值。在Catalyst中,语法树提供了一种转换方法,可以在树的所有节点上递归地应用模式匹配函数,将匹配到的节点转换为特定结果。...Case关键词是scala的标准模式匹配的语法,可以用来匹配一个节点类型,同时将名字和抽取到的值对应。(就是c1和c2)。 模式匹配的表达式是部分函数,这也意味着只需要匹配到输入语法树的子集。...Catalyst将测试给定规则适用的树的哪些部分,自动跳过不匹配的子树。这种能力意味着规则只需要对给定优化适用的树进行推理,而不是那些不匹配的树。结果就是,新的操作类型加入到系统时规则无需修改。...2),将命名的属性(如“col”)映射到给定操作符的子节点的输入中。...后面也会举例讲解,如何在我们的应用中使用。
第十章 数据结构(上)-集合 10.1 数据结构特点 10.1.1 Scala 集合基本介绍 ? 10.1.2 可变集合和不可变集合举例 ?...,从1开始 println(t1.productElement(0)) // 0 访问元组的第一个元素,从0开始 /* productElement 方法底层源码:只是使用到了模式匹配,...10.8.3 List 元素的追加 方式1-在列表的最后增加数据 方式2-在列表的最前面增加数据 ? 方式3-在列表的最后增加数据 ?...方式3-创建空的映射 val map3 = new scala.collection.mutable.HashMap[String, Int] 方式4-对偶元组 即创建包含键值对的二元组,和第一种方式等价...,只是形式上不同而已。
如Scala官网宣称的:“Object-OrientedMeetsFunctional”,这一句当属对Scala最抽象的精准描述,它把近二十年间大行其道的面向对象编程与旧而有之的函数式编程有机结合起来,...实际上,这无关类型争论,而是类型系统实现的范畴。是的,在Scala里,你可以放心大胆地使用vals="ABC",而Scala里强大的类型推断和模式匹配,绝对会让你爱不释手。...模式匹配(PatternMatching) Scala的模式匹配实现非常强大。模式匹配为编程过程带来了莫大便利,在Scala并发编程中也得到了广泛应用。 ?...此外,Scala的模式匹配还有更多用法,如case类匹配、option类型匹配,同时还能带入变量,匹配各种集合类型。综合运用模式匹配,能够极大提升开发效率。...i 然后,在CalcActor的receive中,通过模式匹配,对接收值进行处理,直到接收值处理完成。在运行结果就会发现每次输出的顺序都是不一样的,因为我们的程序是并发计算。
Scala中的控制结构实质上与其他编程语言并无太大差别,需要注意的是Scala中的控制结构大多具有返回值,而其他编程语言中的控制结构一般就仅仅是用于流程控制。...形式虽然一样,但Scala中其实也有其特别之处:那就是Scala中的if-else其实应当理解成一个代码块,而在Scala中但凡是代码块,基本上都对应有返回值,所以无论是单分支、双分支还是多分支,其返回值就是相应分支的结果...同时需指出的是,在单分支中只有if单条语句,当条件不满足时实际上也是对应控制的返回结果。...在模式匹配中另外值得关注的一个细节是,在各匹配分支后,用映射符号"=>"连接条件和执行逻辑,这与Scala中函数的标志性符号是一致的,都表示映射的含义,一定程度上也暗示着模式匹配其实可理解为根据条件逻辑执行一个个的子函数...那如果就是要实现break和continue两个需求呢,实际上Scala中可以灵活选用如下3种方式: 增加if条件判断 for循环中设置循环守卫 while循环中增加相应的判断逻辑 03 小结 控制结构是编写任何程序都不得不涉及到的一个概念
: 自增 自减 三目 scala中的操作符实际上就是scala中方法的调用,只不过为了简洁期间,将方法的调用转换为中缀表达式... Scala中操作符实际上是方法。...1, "b"->2, "c"->3) #取得不存在的key,如果没有返回一个默认值0, 避免程序报错 scala> map.getOrElse("d",...特征:相当于Java中的接口,实际上他比接口功能强大. 2)与接口不同的是:是可以定义属性和方法的实现 3)一般情况下scala的类只能被继承单一父类,但是如果是trait... scala> list.reduce(_ - _) res29: Int = -13 //可以看出,得到的结果和reduceLeft的结果是一样的
主要是为了追求“通用”两个字,想把所有服务接口做的更“范generic”些,结果反而限制了目标数据库的特点,最终产生了一套功能弱小的玩具。...然后get返回的结果集又没有什么灵活的控制方法如返回数量、字段、排序等。...在scala编程里我们是用case class 当作Document来操作的。...httpserver收到两个requests后还要进行requests的匹配对应管理,十分的复杂。...我希望对任何Model的Route只需要指定M即可,如: implicit val personDao = new MongoRepo[Person]("testdb","person", Some
如:cassandra库表设计是反范式的(denormalized)、表结构设计是反过来根据query要求设计的,等等。幸运的是自版本3.0后cassandra提供了CQL来支持数据库操作。...简单来说CQL就是cassandra的SQL。CQL是一种query语言,在语法上与SQL相近。...cassandra数据库用户,所以还是决定提供一种CQL脚本运算环境,也就是说Cassandra-Engine接受CQL脚本然后运算得出结果。...因为数据是重复分布在多个集群节点上的,所以需要通过consistencyLevel来注明分布式数据的读写方式: def consistencyLevel: CONSISTENCY_LEVEL =>..." %% "slick" % "3.2.1", "ch.qos.logback" % "logback-classic" % "1.2.3") CassandraEngine.scala import
领取专属 10元无门槛券
手把手带您无忧上云