如何使用 Slick 3.0.0 执行 sql 文件
How to execute sql file with Slick 3.0.0
我有这样的结构
src
└── main
├── resources
│ └── inserts.sql
└── my.package
└── Main.scala
在 Main.scala
中,我想获取文件 inserts.sql
并使用 Slick 3.0.0 在我的数据库上执行它。
您可以读取文件内容:
val query = scala.io.Source.fromResource("inserts.sql").mkString
然后使用 sql
或 sqlu
插值器创建查询:
//https://scala-slick.org/doc/3.0.0/sql.html
sql"$query".as[ExpectedType]
和运行 一如既往:)
PS:未测试。现在没有准备环境
看起来无法使用 Slick 执行 sql 文件,然后将其作为字符串加载到内存中并使用 sql
、sqlu
或 [=13 执行它=].
请注意,在这种情况下,$
插值意味着将绑定变量插入到查询中。要将文字值拼接到查询中,您必须改用 #$
。由于在这种情况下变量是整个查询,我们必须做
val inserts_sql = Source.fromResource("inserts.sql").mkString
db.run(sqlu"#$query")
一个SQL字符串可以直接使用SQLActionBuilder
class.
执行
此外,由于我们从 Source.fromResource
获得的 BufferedSource
对象是 Closable
,我们应该用 Using 块包装它。
import slick.jdbc.SetParameter.SetUnit
import slick.jdbc.SQLActionBuilder
import scala.io.Source
import scala.util.Using
// ...
Using(Source.fromResource("inserts.sql")) { insertsSqlSource =>
val sqlActionBuilder = SQLActionBuilder(insertsSqlSource.mkString, SetUnit)
database.run(sqlActionBuilder.asUpdate)
}
我有这样的结构
src
└── main
├── resources
│ └── inserts.sql
└── my.package
└── Main.scala
在 Main.scala
中,我想获取文件 inserts.sql
并使用 Slick 3.0.0 在我的数据库上执行它。
您可以读取文件内容:
val query = scala.io.Source.fromResource("inserts.sql").mkString
然后使用 sql
或 sqlu
插值器创建查询:
//https://scala-slick.org/doc/3.0.0/sql.html
sql"$query".as[ExpectedType]
和运行 一如既往:)
PS:未测试。现在没有准备环境
看起来无法使用 Slick 执行 sql 文件,然后将其作为字符串加载到内存中并使用 sql
、sqlu
或 [=13 执行它=].
请注意,在这种情况下,$
插值意味着将绑定变量插入到查询中。要将文字值拼接到查询中,您必须改用 #$
。由于在这种情况下变量是整个查询,我们必须做
val inserts_sql = Source.fromResource("inserts.sql").mkString
db.run(sqlu"#$query")
一个SQL字符串可以直接使用SQLActionBuilder
class.
此外,由于我们从 Source.fromResource
获得的 BufferedSource
对象是 Closable
,我们应该用 Using 块包装它。
import slick.jdbc.SetParameter.SetUnit
import slick.jdbc.SQLActionBuilder
import scala.io.Source
import scala.util.Using
// ...
Using(Source.fromResource("inserts.sql")) { insertsSqlSource =>
val sqlActionBuilder = SQLActionBuilder(insertsSqlSource.mkString, SetUnit)
database.run(sqlActionBuilder.asUpdate)
}