标签: slick-3.0

如何使用Slick 3.0调用MySQL中的存储过程和定义的函数

我在我的数据库中定义了这样的东西

CREATE FUNCTION fun_totalInvestorsFor(issuer varchar(30)) RETURNS INT
NOT DETERMINISTIC
BEGIN
  RETURN (SELECT COUNT(DISTINCT LOYAL3_SHARED_HOLDER_ID) 
      FROM stocks_x_hldr
      WHERE STOCK_TICKER_SIMBOL = issuer AND
            QUANT_PURCHASES > QUANT_SALES);
END;
Run Code Online (Sandbox Code Playgroud)

现在我收到了Stefan Zeiger的回答(Slick领导),我在这里重定向:Slick中的用户定义函数

我试过(在范围内有以下对象):

lazy val db = Database.forURL("jdbc:mysql://localhost:3306/mydb",
driver = "com.mysql.jdbc.Driver", user = "dev", password = "root")
val totalInvestorsFor = SimpleFunction.unary[String, Int]("fun_totalInvestorsFor")
totalInvestorsFor("APPLE") should be (23)
Run Code Online (Sandbox Code Playgroud)

结果: Rep(slick.lifted.SimpleFunction$$anon$2@13fd2ccd fun_totalInvestorsFor, false) was not equal to 23

我也尝试过在src/main/resources中有一个application.conf,如下所示:

tsql = {
  driver = "slick.driver.MySQLDriver$"
  db {
    connectionPool = disabled
    driver = "com.mysql.jdbc.Driver"
    url = "jdbc:mysql://localhost/mydb"
  } …
Run Code Online (Sandbox Code Playgroud)

mysql scala slick-3.0

5
推荐指数
1
解决办法
2833
查看次数

使用Slick为java.time.LocalDate创建自定义列映射

我正在使用Slick 3.1.0-M2,我希望在我的表中使用java.time.LocalDate和java.time.LocalTime.我是这样做的:

import java.sql.{Date, Time, Timestamp}
import java.time.{LocalDate, LocalTime, LocalDateTime, ZoneOffset}

trait DateTimeColumns {

  import slick.driver.PostgresDriver.api._

  implicit val localDateTimeColumnType = MappedColumnType.base[LocalDateTime, Timestamp](
    d => Timestamp.from(d.toInstant(ZoneOffset.ofHours(0))),
    d => d.toLocalDateTime
  )

  implicit val dateColumnType = MappedColumnType.base[LocalDate, Date](
    d => Date.valueOf(d),
    d => d.toLocalDate
  )

  implicit val timeColumnType = MappedColumnType.base[LocalTime, Time](
    localTime => Time.valueOf(localTime),
    time => time.toLocalTime
  )
}
Run Code Online (Sandbox Code Playgroud)

所以我有3个隐式映射,但只有第一个编译.java.sql.Date和java.sql.Time的编译失败了:

could not find implicit value for evidence parameter of type slick.driver.PostgresDriver.BaseColumnType[java.sql.Date]
Run Code Online (Sandbox Code Playgroud)

当我在IntelliJ中进行隐式参数检查时,我可以看到第一个映射在文件JdbcTypesComponent.scala中找到TimestampJdbcType.紧挨着我,我看到了TimeJdbcType和DateJdbcType.那么为什么第一个被发现但其他人不是?

scala slick slick-3.0

5
推荐指数
1
解决办法
1769
查看次数

如何在Scala中链接泛型含义?

这个帖子,讨论implicits的链接,但我认为它不包括我的情况,因为我有通用implicits.演示此问题的示例项目位于此处.要重现两条线应该被注释掉.

所以我对具体类型有许多含义,例如

implicit val ObjectIdColumnType: ColumnType[ObjectId] = MappedColumnType.base[ObjectId, Array[Byte]](
      { obj => obj.toByteArray }, { arr => new ObjectId(arr) }
    )
Run Code Online (Sandbox Code Playgroud)

我希望所有这些都能自动生成GetResult[T]隐式val.因此我写了以下功能

implicit def getResultForTypedTypes[T](implicit bct: ColumnType[T]): GetResult[T] =
  GetResult[T](r => bct.getValue(r.rs, r.currentPos))
Run Code Online (Sandbox Code Playgroud)

我希望这个功能与原型如

def << [T](implicit f: GetResult[T]): T = f(this)
Run Code Online (Sandbox Code Playgroud)

能够接受 GetResult[ObjectId]

可悲的是我得到了错误

Error:(78, 20) could not find implicit value for parameter f: slick.jdbc.GetResult[org.bson.types.ObjectId]
      val id = r.<<[ObjectId]
                   ^
Run Code Online (Sandbox Code Playgroud)

我启用了log-implicits,发现看似无关的隐式隐藏在某种程度上

Information:(78, 20) getResultForTypedTypes is not a valid implicit value for …
Run Code Online (Sandbox Code Playgroud)

scala implicit-conversion implicits slick slick-3.0

5
推荐指数
0
解决办法
180
查看次数

如何通过Play Slick Evolution重新生成SQL脚本

我正在使用Play 2.4.0和Slick 3.1。我试图弄清楚如何通过Slick演化来重新生成SQL。我在模型中修改了我的类。*但未重新生成任何SQL脚本。请帮忙。

这是我的配置:

plugin.sbt

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.4.0")
Run Code Online (Sandbox Code Playgroud)

build.sbt

libraryDependencies ++= Seq(
???
evolutions,
"com.typesafe.play" % "play-slick_2.11" % "1.1.1",
"com.typesafe.play" %% "play-slick-evolutions" % "1.1.1",
????
)
Run Code Online (Sandbox Code Playgroud)

如官方文档https://www.playframework.com/documentation/2.4.x/Evolutions或问题“ 在播放2中重新生成演化脚本 ”中所述,我正在运行以下应用程序。

  • 我正在开发模式下运行myapp
  • 在application.conf中,我没有对此行发表评论:
    • slick.default =“ models。*”
    • play.evolutions.enabled =真
  • 您的evolutions文件夹中只有一个文件,它是1.sql
  • 它在开始时有此评论:

    #要停止生成Slick DDL,请删除此注释并开始使用Evolutions

playframework slick slick-3.0 playframework-2.4

5
推荐指数
1
解决办法
962
查看次数

Slick 3 java.time.LocalDate映射

我使用的是Slick 3.1.0,需要保留java.time.LocalDate类型的字段.

我有模特课:

case class Position(companyName: String, title: String, startDate: Option[LocalDate], endDate: Option[LocalDate], positionId: Option[Int] = None)
Run Code Online (Sandbox Code Playgroud)

以下映射:

private[PositionTable] class PositionTable(tag: Tag) extends Table[Position](tag, "POSITIONS")  {
    val positionId = column[Int]("POSITION_ID", O.PrimaryKey, O.AutoInc)
    val companyName = column[String]("COMPANY_NAME")
    val title = column[String]("TITLE")
    val startDate = column[Date]("START_DATE")
    val endDate = column[Date]("END_DATE")
    def * = (companyName, title, startDate, endDate, positionId.?) <>(Position.tupled, Position.unapply)
}
Run Code Online (Sandbox Code Playgroud)

如何将startDate和endDate字段映射到数据库中以DATE类型表示?

列映射器中的NullPointerException的Stacktrace:

java.lang.NullPointerException
    at com.tiedin.repo.PositionTable$class.$init$(PositionRepository.scala:54)
    at repo.PositionRepositoryTest.<init>(PositionRepositoryTest.scala:13)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at java.lang.Class.newInstance(Class.java:442)
    at org.scalatest.tools.Runner$.genSuiteConfig(Runner.scala:1422)
    at …
Run Code Online (Sandbox Code Playgroud)

java scala date slick slick-3.0

5
推荐指数
1
解决办法
2617
查看次数

在普通 SQL 中按列名填充 case 类

使用Slick 的普通 SQL,我使用 getResult 提取案例类。

case class Foo(a: String, b: String)

def foos(): Future[Vector[Foo]] ={
  val getFoo = GetResult(r => Foo(r.<<, r.<<))
  sql"SELECT a, b FROM foo"
    .as(GetFoo)   // could also use getFoo as an implicit and use .as(Foo)
}
Run Code Online (Sandbox Code Playgroud)

对于长的情况下,该班迅速变得很困难。我可以通过列的名称,而不是使用r.>>r.nextString等?


使用Anorm 我会做这样的事情:

val parser: RowParser[Foo] = Macro.parser[Foo]("a", "b")
/* Generated as:
get[String]("a") ~ get[String]("b") map {
  case a ~ b => Foo(a, b)
}
*/

def foos(): List[Foo] ={
  SQL("SELECT a, b …
Run Code Online (Sandbox Code Playgroud)

scala slick slick-3.0

5
推荐指数
0
解决办法
262
查看次数

使用Slick 3.1.x将数据库连接返回到HikariCP池

我正在从typesafe配置中设置一个光滑的Database对象,如下所示:

import com.typesafe.config.Config

class DatabaseService(configKey: String, config: Config) {
  val driver = slick.driver.MySQLDriver
  import driver.api._
  val db = Database.forConfig(configKey, config)
}
Run Code Online (Sandbox Code Playgroud)

config对象告诉Slick使用HikariCP,如下所示:

db {
  numThreads = 5
  connectionTimeout = 30000
  maximumPoolSize = 26
  driver = "com.mysql.jdbc.Driver"
  url = "jdbc:mysql://localhost:3306/some_db?useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&useSSL=false"
  user = "root"
  password = "root"
  connectionPool = "HikariCP"
}
Run Code Online (Sandbox Code Playgroud)

实例化DatabaseService之后,我可以通过运行来运行查询dbService.db.run(someQuery)

第一个问题是我需要做一些事情以从池中获得连接,还是在调用时在幕后发生db.run()

其次,一旦执行了一个或多个查询,如何将当前数据库连接返回到连接池?

scala hikaricp slick-3.0

5
推荐指数
1
解决办法
2117
查看次数

在 Scala/Slick 中设置默认值

我正在尝试在 Play 框架中使用 Scala/Slick 保存数据。我正在通过 json 发送请求,并尝试通过将其与如下模型匹配来验证所述请求:

request.body.asJson.map(_.validate[Foo] match {...}
Run Code Online (Sandbox Code Playgroud)

问题是:如何设置默认列值(为 false)?

这是我的进化文件:

CREATE TABLE Foo(
    ...
    deleted BOOLEAN NOT NULL DEFAULT FALSE,
    ...
)
Run Code Online (Sandbox Code Playgroud)

这是我的模型(.scala):

case class Foo(
                    ...
                    deleted: Boolean,
                    ...)
Run Code Online (Sandbox Code Playgroud)

这是我的 dao (.scala):

 class Foo(tag: Tag) extends TableFoo(tag, "Foo"){
            ...
                def deleted = column[Boolean]("deleted", O.Default(false))
            ...

                def * = (..., deleted, ...) <> ((Foo.apply _).tupled, Foo.unapply)
        }
Run Code Online (Sandbox Code Playgroud)

验证模型请求时出现问题。定义deleted为时Option[Boolean],它None/Null为列写入deleted。将其定义为 时Boolean,验证失败。大概是因为请求缺少 属性deleted

Option[Boolean]当验证失败或者只是写入的情况下,为什么要定义默认值None/Null?有没有一种简单的方法可以在 Scala/Slick …

scala playframework slick slick-3.0

5
推荐指数
0
解决办法
945
查看次数

在Slick中添加评论

有没有一种方法可以在不编写原始sql语句的情况下将注释添加到由slick形成的sql中?这是为了跟踪启动sql的应用程序中的代码。

postgresql scala slick-3.0

5
推荐指数
1
解决办法
94
查看次数

Scala slick:在多列上使用“in”进行过滤

假设我有以下表结构:

create table PEOPLE (
    ID integer not null primary key,
    NAME varchar(100) not null
);

create table CHILDREN (
    ID integer not null primary key,
    PARENT_ID_1 integer not null references PERSON (id),
    PARENT_ID_2 integer not null references PERSON (id)
);
Run Code Online (Sandbox Code Playgroud)

我想生成每个父母的姓名列表。在光滑的我可以写这样的东西:

for {
  parent <- people
  child  <- children if {
    parent.id === child.parent_id_1 ||
    parent.id === child.parent_id_2
  }
} yield {
  parent.name
}
Run Code Online (Sandbox Code Playgroud)

这会生成预期的 SQL:

select p.name
from people p, children c
where p.id = c.parent_id_1 or p.id …
Run Code Online (Sandbox Code Playgroud)

scala slick slick-3.0

5
推荐指数
1
解决办法
1278
查看次数