我在我的数据库中定义了这样的东西
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) 我正在使用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.那么为什么第一个被发现但其他人不是?
有这个帖子,讨论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) 我正在使用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中重新生成演化脚本 ”中所述,我正在运行以下应用程序。
它在开始时有此评论:
#要停止生成Slick DDL,请删除此注释并开始使用Evolutions
我使用的是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) 使用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) 我正在从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()
?
其次,一旦执行了一个或多个查询,如何将当前数据库连接返回到连接池?
我正在尝试在 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 …
有没有一种方法可以在不编写原始sql语句的情况下将注释添加到由slick形成的sql中?这是为了跟踪启动sql的应用程序中的代码。
假设我有以下表结构:
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)