使用普通 SQL 创建 Table?

Create Table Using Plain SQL?

我正在尝试使用 Slick 3 的 Plain Sql sql 创建 table:

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]
              ^

如何解决上述错误?

使用 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

区别在于:对 returns 结果集的任何内容使用 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

...这也给了你想要的效果。