Slick是一个FRM(Functional Relational Mapper),是为fp编程提供的scala SQL Query集成环境,可以让编程人员在scala编程语言里用函数式编程模式来实现对数据库操作的编程...表行的实际类型如下: abstract class Table[T](_tableTag: Tag, _schemaName: Option[String], _tableName: String) extends...值得注意的是表行的最终类型是Rep[T],T可能是case class或者Tuple,被升格(lift)到Rep[T]。所以大部分表行定义的支持函数都是在slick.lifted命名空间内的。...TableQuery[T]继承了Query[T]:slick.lifted.Query.scala /** Represents a database table....一般来讲Query.result返回R类型为Seq[?]。 DBIOAction只是对数据库操作动作的描述,不是实际的读写,所以DBIOAction可以进行组合。
看完Slick官方网站上关于Slick3.1.1技术文档后决定开始动手建一个项目来尝试一下Slick功能的具体使用方法。我把这个过程中的一些了解和想法记录下来和大家一起分享。...Slick是集成jdbc的更高层的Query编程语言,可以通过jdbc的url、DataSource等来指定目标数据库类型及相关的参数。...) 在Slick的Database配置方面forConfig("confItem")是比较灵活、方便实用的。...forConfig函数用typesafe-config库里的函数载入application.conf文件解析confItem并获取项目里的数据库配置参数,下面是项目中resources/application.conf...: 1 package com.datatech.learn.slick101 2 import scala.concurrent.ExecutionContext.Implicits.global
前面几篇介绍里尝试了一些Slick的功能和使用方式,看来基本可以满足用scala语言进行数据库操作编程的要求,而且有些代码可以通过函数式编程模式来实现。...在src/main/resources是scala项目获取配置文件的默认目录、我们可以按照需要在src/main/scala下增加代码子目录(package)及在src/main/test下摆放测试代码...Slick把jdbc api集成到scala编程语言里,能够支持多种数据库。也就是说Slick提供了多种数据库的驱动api。...先试试用最传统的依赖注入方式:传入参数来注入这个数据库驱动依赖,把代码放在src/main/scala/model/TableDefs.scala里: 1 package com.bayakala.learn.slick301...我们在src/main/scala/main/Main.scala里测试运算DAOs里的query action: 1 package com.bayakala.learn.slick301.main
先介绍一下slick,它是一款开源的scala语言数据库处理框架,官网http://slick.lightbend.com/。...;name对应表中name字段,类型为String;geom对应空间字段geom,类型为Point(空间字段类型可以直接设置为Geometry);def * 表示三个字段的组合。...2.4 操作类 上文讲到slick的优势就在于我们可以像使用scala集合那样读取数据库中信息,并能够对数据库进行操作。...当然如果在实体映射中某个字段按照上述方式设置可空,那么在insert以及下面的update操作的时候此字段的类型都要为Option,即有值的地方使用Some包裹,无值的地方设置为None。...,此处q直接获取到的是缓冲区内的城市所有信息,所以将q.result传入db.run后就能获取到缓冲区内的城市的所有信息。
所以我们只能从小众心态来探讨如何改善Slick现状,希望通过与某些Stream库集成,在Slick FRM的基础上恢复一些人们熟悉的Recordset数据库光标(cursor)操作方式,希望如此可以降低...[Task,Option[T]]) extends GraphStage[SinkShape[T]] { val in = Inlet[T]("inport") val shape = SinkShape.of...") println(s"取值:${qmr.value}") println("-------------") }).run.unsafeRun 通过测试运行,我们成功的为...下面是本次示范的源代码: import slick.jdbc.H2Profile.api._ import com.bayakala.funda._ import api._ import scala.language.implicitConversions...{GraphStage, GraphStageLogic} class FS2Gate[T](q: fs2.async.mutable.Queue[Task,Option[T]]) extends
FunDA的特点之一是以数据流方式提供逐行数据操作支持。这项功能解决了FRM如Slick数据操作以SQL批次模式为主所产生的问题。...在前面的一篇讨论中我们介绍了通过Shape来改变Slick Query结果行类型。不过这样的转变方式需要编程人员对Slick有较深的了解。更重要的是这种方式太依赖Slick的内部功能了。...下面先看一个典型的Slick Query例子: 1 import slick.driver.H2Driver.api._ 2 import scala.concurrent.duration._...返回结果行类型是个Tuple类型:(String,String,Option[Int],Int),没有字段名的,所以只能用r._1,r._2...这样的位置注明方式来选择字段。...._ 4 import scala.concurrent.Await 5 import slick.driver.JdbcProfile 6 7 object DataRowType { 8
具体来说Projection提供了数据库表列与Scala值的对应。...从Slick源代码中我们可以找到Projection定义: abstract class AbstractTable[T](val tableTag: Tag, val schemaName: Option...我们来看看Slick官方文件上的例子: import scala.reflect.ClassTag // A custom record class case class Pair[A, B...回到主题,下面是一个典型的Slick数据库表读取例子: 1 class TupleTypedPerson(tag: Tag) extends Table[( 2 Option[Int]...的T类型就是Table[T]的T,也就是返回结果行的类型了。
=> QueryAction(DataRow) -> ActionRow => execAction(ActionRow) -> Database 如果我们还是以Slick为目标FRM,那么这个ActionRow...的类型就是Slick的DBIO[T]了: 1 package com.bayakala.funda.rowtypes 2 import slick.dbio._ 3 object ActionType...{ 4 type FDAAction[T] = DBIO[T] 5 } 记得有一次在一个Scala讨论区里遇到这样一个问题:如何把a表里的status字段更新成b表的status字段值,转化成SQL...先用下面这段代码来设置测试数据: 1 import slick.dbio.DBIO 2 import slick.driver.H2Driver.api._ 3 4 import scala.concurrent.duration...._ 3 object ActionType { 4 type FDAAction[T] = DBIO[T] 5 } 1 import slick.dbio.DBIO 2 import slick.driver.H2Driver.api
ScalikeJDBC在覆盖JDBC基本功能上是比较完整的,而且实现这些功能的方式比较简洁,运算效率方面自然会稍高一筹了。...一般来说,各种JDBC工具库如ORM,FRM软件通过各自的DSL在复杂的数据库表关系环境内进行数据管理编程,最终产生相关的SQL语句即(prepared)statement+parameters传递给指定类型的数据库...如果这样描述,那么JDBC-Engine主要的功能就是支持下面这个函数: jdbcRunSQL(context: JDBCContext): JDBCResultSet 这个函数的用户提供一个JDBCContext...类型值,然后由jdbcRunSQL进行接下来的运算并返回结果。... HikariCP连接池实现 package configdbs import scala.collection.mutable import scala.concurrent.duration.Duration
FDAAggrTask,如下定义: type FDAAggrTask[AGGR,ROW] = (AGGR,ROW) => (AGGR,Option[List[ROW]]) AGGR是个用户自定义类型...本次示范的源代码如下: import slick.jdbc.meta._ import com.bayakala.funda._ import api._ import scala.language.implicitConversions...import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration._ import...scala.concurrent....{Await, Future} import scala.util.
我们在这次示范里可以对比一下同样工作内容的并行运算和串形运算效率。在前面示范里我们获取了一个AQMRPT表。...case _ => fda_skip } } countyStream.appendTask(getid).startRun id } 我们可以如下这样获取这个程序的数据源...流程我们设计了两个用户自定义函数:一个根据数据行内的state和county字段调用函数getStateID和getCountyID获取相应id后构建一条新的NORMAQM表插入指令行,然后传给下个自定义函数...下面就是这次示范的源代码: import slick.jdbc.meta._ import com.bayakala.funda._ import api._ import scala.language.implicitConversions...scala.concurrent.
在前面我们已经掌握了用Slick来产生Stream[Task,FDAROW]的方法,例如: val albumStream1 = streamLoader.fda_typedStream(albumsInfo.result...先看看这个函数的款式: //作业类型 type FDATask[ROW] = ROW => Option[List[ROW]] 也就是我们前面使用过的,由用户提供的那个作业函数类型。...Stream[Task,A]]: implicit class toFDAOps(fs2Stream: FDAPipeLine[FDAROW]) { def appendTask(t:...我们同样可以把产生的ActionRow用并行的方法来运算: val runner = FDAActionRunner(slick.driver.H2Driver) //并行运算函数 def...下面是本篇讨论的示范源代码: package com.bayakala.funda.fdapars.examples import slick.driver.H2Driver.api._ import
作为一种通用的数据库编程引擎,用Streaming来应对海量数据的处理是必备功能。同样,我们还是通过一种Context传递产生流的要求。...rawSql.map(ctx.extractor) sql.collection.apply[C]() } 试运行: object SlickDAO { import slick.jdbc.H2Profile.api..."com.zaxxer" % "HikariCP" % "2.7.4", "com.jolbox" % "bonecp" % "0.8.0.RELEASE", "com.typesafe.slick..." %% "slick" % "3.2.1", "ch.qos.logback" % "logback-classic" % "1.2.3", "com.typesafe.akka" %...kill.shutdown() actorSys.terminate() println("+++++++++++++++") object SlickDAO { import slick.jdbc.H2Profile.api
这次介绍的数据源并行构建方式也与前面描述的有所不同:在前面讨论里我们预知需要从三个独立流来并行构建数据源。但如果我们有一个不知长度的数据流,它的每个元素代表不同的数据流,应该如何处理。...: import slick.jdbc.meta._ import com.bayakala.funda._ import api._ import scala.language.implicitConversions...import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration._ import...scala.concurrent....{Await, Future} import scala.util.
FDATask[FDAROW],这是一个函数类型: //作业类型 type FDATask[ROW] = ROW => Option[List[ROW]] 所以我们用lambda来代表函数内容...lambda为用户函数提供了当前元素。...下面是这篇讨论的示范源代码: package com.bayakala.funda.fdasources.examples import slick.driver.H2Driver.api._ import...com.bayakala.funda.fdapipes._ import FDAValves._ import com.bayakala.funda.fdarows.FDARowTypes._ import scala.concurrent.duration...String, year: Int, publisher: String) extends FDAROW //转换函数(用户提供) def toTypedRow(row: (String, String, Option
我认为这是一项非常好的技术,它可以满足构建微服务所需的所有基本要求: 易于实现 快速 健壮性 很好的支持和文档记录 在数据方面,我选择了Slick作为库,将数据库交互和FlyWay抽象为数据库迁移框架。...协议为CDC测试。...(request: HttpRequest, responseHandler: HttpResponse => Future[T]): T = { val response: Future[T]...正如我们为数据库支持所做的那样,我们可以实现一个提供执行迁移功能的特性: DatabaseMigrationSupport.scala package com.fm.mylibrary.producer.db...它使用特征来获取数据库连接信息。
想通过这篇博客把想法提出来跟大家分享一下,看看是否能够引起大家的共鸣,为我下一步的工作制定一个方向性的框架。...首先谈谈Slick的特点:主体方面Slick为函数式编程模式带来了SQL编程,可以把数据库表当作scala语言中的集合来对待。...这样看来Slick的工作原理大体上是: 构建Query >>> 组合Query >>> 产生SQL语句 >>> 按流程把SQL语句发给数据库进行运算 >>> 获取结果 完成了上面的叙述后,总觉着好像缺少些什么...是了,Slick把jdbc的resultset隐藏起来了。其目的可以理解:这样可以实现语法安全(type safety),才能把SQL编程融入FP编程,即scala集合编程。...library)分享给scala数据库编程的朋友使用。
最近刚好有同事在学习MongoDB,我们讨论过MongoDB应该置于服务器端然后通过web-service为客户端提供数据的上传下载服务。...在谈到restapi之前我在这篇讨论先介绍一下MongoDB数据库操作的scala编程,因为与传统的SQL数据库操作编程有比较大的差别。...MongoDBEngine是基于mongodb-scala-driver上开发的一套MongoDB数据库CRUD Scala编程工具,其主要功能可以从下面这三个函数中反映出来: def mgoUpdate...首先需要注意的是它们的返回结果类型: DBOResult[T],实质上是 Future[Either[String,Option[T]]] type DBOError[A] = EitherT[Task...Future (Task即Future, 如:Task.runToFuture) 2、返回结果可能为空,所以用Option 3、发生错误结果也为空,但需要知道空值是由错误产生的,所以用了Either 把所有返回结果类型统一成
我们可以用隐式转换(implicit conversion)把它转换成scala-future来使用: implicit def listenableFutureToFuture[T](...listenableFuture: ListenableFuture[T]): Future[T] = { val promise = Promise[T]() Futures.addCallback..."com.zaxxer" % "HikariCP" % "2.7.4", "com.jolbox" % "bonecp" % "0.8.0.RELEASE", "com.typesafe.slick..." %% "slick" % "3.2.1", "ch.qos.logback" % "logback-classic" % "1.2.3") CassandraEngine.scala import...( listenableFuture: ListenableFuture[T]): Future[T] = { val promise = Promise[T]()
在5月份的深圳scala meetup上我分享了有关集群环境下的编程模式思路。我提供了下面这个示意图: ? 上图是我正在探讨的“现代企业I.T综合数据平台”网络结构。...由于jdbc数据库不支持分布式的运算模式,所以从数据交换的角度上它与集群环境是脱离的:jdbc数据不可以从集群中的任何节点获取。所以只有通过基于http的一种服务来向其它节点提供数据。..., parameters = marshal(Seq("Arizona", 5)) ) 然后via Flow传给服务端获取一个akka-stream Source[JBCDataRow,NotUsed..." %% "slick" % "3.2.1", "ch.qos.logback" % "logback-classic" % "1.2.3", "com.typesafe.akka" %..." // don't append file name to package flat_package: true // generate one Scala file for all
领取专属 10元无门槛券
手把手带您无忧上云