使用纯SQL创建表?

时间:2015-12-28 16:01:43

标签: scala slick

我正在尝试使用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]
              ^

如何修复上述错误?

2 个答案:

答案 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