我正在尝试使用Slick 3的Plain Sql sql
创建一个表:
scala> import slick.driver.MySQLDriver.api._
import slick.driver.MySQLDriver.api._
scala> sql""" CREATE TABLE `FOOBAR` (`BIPPY` varchar(32) NOT NULL) """
res0: slick.jdbc.SQLActionBuilder = SQLActionBuilder(Vector( CREATE TABLE `FOOBAR` (`BIPPY` varchar(32) NOT NULL) ),<function2>)
我试图通过as[...]
徒劳地进行编译。
scala> res0.as[Nothing]
<console>:15: error: could not find implicit value for parameter rconv: slick.jdbc.GetResult[Nothing]
res0.as[Nothing]
^
scala> res0.as[Unit]
<console>:15: error: could not find implicit value for parameter rconv: slick.jdbc.GetResult[Unit]
res0.as[Unit]
^
如何修复上述错误?
答案 0 :(得分:1)
区别在于:对返回结果集的任何内容使用sql
,对其他任何内容使用sqlu
。
所以,你已经明白了:使用sqlu
。但是,有一个变化要知道......
<强> asUpdate 强>
除了as[T]
之外,sql
插补器还为您提供asUpdate
方法:
scala> sql"""create table foo(x int) """.asUpdate
res1: slick.profile.SqlStreamingAction[Vector[Int],Int,slick.dbio.Effect]#ResultAction[Int,slick.dbio.NoStream,slick.dbio.Effect] = slick.jdbc.StreamingInvokerAction$HeadAction@647bf3c3
要运行你db.run(res1)
,这会给你这样的输出:
DEBUG slick.jdbc.JdbcBackend.statement - Preparing statement: create table foo(x int)
DEBUG slick.jdbc.StatementInvoker.result - 0 rows affected
res2: Int = 0
...这也为你提供了你想要的效果。
答案 1 :(得分:0)
使用sqlu
工作:
scala> import slick.driver.MySQLDriver.api._
import slick.driver.MySQLDriver.api._
scala> val action: DBIO[Int] = sqlu""" CREATE TABLE FOOBAR (BIPPY
varchar(32) NOT NULL) """
action: slick.driver.MySQLDriver.api.DBIO[Int] = slick.jdbc.StreamingInvokerAction$HeadAction@47b8399e
信用 - Essential Slick