我是Slick 3的新手,到目前为止我已经理解db.run是异步调用.返回Future后运行.map或.flatMap.
我的代码中的问题是所有子查询都不起作用(嵌套db.run).
从概念上讲,我没有得到什么?这样的代码是否有效,如下所示?基本上在第一个查询的.map中我根据第一个查询执行一些操作.
我到处都看到有产量的循环,它是唯一的出路吗?我的代码中的问题是否与返回的Future值有关?
val enterprises = TableQuery[Enterprise]
val salaries = TableQuery[Salary]
//Check if entered enterprise exists
val enterpriseQS = enterprises.filter(p => p.name.toUpperCase.trim === salaryItem.enterpriseName.toUpperCase.trim).result
val result=db.run(enterpriseQS.headOption).map(_ match
{
case Some(n) => {
//if an enterprise exists use the ID from enterprise (n.id) when adding a record to salary table
val addSalary1 = salaries += new SalaryRow(0, n.id, salaryItem.worker)
db.run(addSalary1)
}
case None => {
//if an enterprise with salaryItem.enterpriseName doesn't exist, a new enterprise is inserted …
Run Code Online (Sandbox Code Playgroud) 我想在每个测试文件的开头手动运行我的evolution脚本.我正在玩Play!2.4和Slick 3.
根据文档,走的路似乎是:
Evolutions.applyEvolutions(database)
Run Code Online (Sandbox Code Playgroud)
但我无法获得我的数据库实例.在导入文档 play.api.db.Databases
以获取数据库实例但是如果我尝试导入它,我收到此错误:object Databases is not a member of package play.api.db
如何获取我的数据库实例才能运行evolution脚本?
编辑:如评论中所述,这里是给出错误的完整源代码:
import models._
import org.scalatest.concurrent.ScalaFutures._
import org.scalatest.time.{Seconds, Span}
import org.scalatestplus.play._
import play.api.db.evolutions.Evolutions
import play.api.db.Databases
class TestAddressModel extends PlaySpec with OneAppPerSuite {
lazy val appBuilder = new GuiceApplicationBuilder()
lazy val injector = appBuilder.injector()
lazy val dbConfProvider = injector.instanceOf[DatabaseConfigProvider]
def beforeAll() = {
//val database: Database = ???
//Evolutions.applyEvolutions(database)
}
"test" must {
"test" in { }
}
}
Run Code Online (Sandbox Code Playgroud) 我发现Slick 3.0引入了一个名为的新功能 streaming
http://slick.typesafe.com/doc/3.0.0-RC1/database.html#streaming
我不熟悉阿卡.streaming
似乎是一个懒惰或异步的值,但我不太清楚为什么它有用,什么时候它会有用..
有没有人有这个想法?
在Slick的文档中,使用Reactive Streams的示例仅用于读取数据作为DatabasePublisher的一种方式.但是,如果您希望根据插入率将数据库用作接收器和后端,会发生什么?
我找了等效的DatabaseSubscriber,但它不存在.所以问题是,如果我有一个来源,说:
val source = Source(0 to 100)
如何用Slick创建一个Sink,将这些值写入带有模式的表中:
create table NumberTable (value INT)
我有一个基于play-scala Typesafe模板(Play Scala Seed)的Play应用程序,并尝试将Slick 3.0.0添加到项目中并连接到PostgreSQL数据库.
首先,我将依赖项添加到build.sbt
:
libraryDependencies ++= Seq(
"com.typesafe.slick" %% "slick" % "3.0.0-RC1",
"postgresql" % "postgresql" % "9.1-901.jdbc4"
)
Run Code Online (Sandbox Code Playgroud)
然后添加数据库配置application.conf
:
brDb = {
dataSourceClass = org.postgresql.ds.PGSimpleDataSource
url = "jdbc:postgresql://localhost:5432/test"
user = "postgres"
password = "postgres"
numThreads = 10
}
Run Code Online (Sandbox Code Playgroud)
请注意,我没有明确禁用池,因此它默认启用,并将尝试使用HikariCP,因为从Slick 3.0.0 RC1开始,HikariCP支持存在,默认情况下启用使用它的池.
在我的DAO对象中,尝试获取如下数据库连接:
Database.forConfig("brDb")
Run Code Online (Sandbox Code Playgroud)
当我使用app运行时activator run
,我收到此错误:
RuntimeException:java.lang.NoClassDefFoundError:com/zaxxer/hikari/HikariConfig
然后我尝试添加HikariCP作为依赖build.sbt
:
libraryDependencies ++= Seq(
// ...
"com.zaxxer" % "HikariCP" % "2.3.3",
// ...
)
Run Code Online (Sandbox Code Playgroud)
清理并重新编译应用程序activator clean compile
,并再次运行它,但我收到另一个错误:
RuntimeException:java.lang.UnsupportedClassVersionError:com/zaxxer/hikari/HikariConfig …
在Slick 2.1中,我有以下代码从文件执行sql-query:
def fetchResult[T](sql: String)(implicit getResult: GetResult[T]): List[T] = {
val query = Q.queryNA[T](sql)
try {
Database.forDataSource(DB.getDataSource())
.withSession { implicit session => query.list }
}
catch {
case e: Throwable =>
throw new RunSqlException(s"Query $name execution error", e)
}
}
Run Code Online (Sandbox Code Playgroud)
在Slick 3.0.0中,您使用dbConfig.db.run方法来执行DBIOAction并获得结果的未来.但是我找不到将Q.queryNA(也就是StaticQuery[Unit, R]
)的结果转换成的方法DBIOAction
.这样的方式存在吗?
我现在结束了不赞成的电话.帮助我变得更好!
def fetchResult[T](sql: String)(implicit getResult: GetResult[T]): Future[List[T]] = Future {
val query = Q.queryNA[T](sql)
try {
this.dbConfig.db.withSession { implicit session => query.list }
}
catch {
case e: Throwable =>
throw new RunSqlException(s"Query …
Run Code Online (Sandbox Code Playgroud) 我有这样的多对多关系设置:
人< - > PersonField < - >字段
现在,我不仅要查询Person的所有字段(我可以这样做),而且还要查询PersonField与Person of Field的连接版本.(我想在数据透视/中间表"PersonField"中查询/检索信息!)
人:
case class Person(id: Long, name: String)
{
def fields =
{
person <- Persons.all.filter(_.id === this.id)
field <- person.fields
} yield field
}
class Persons(tag: Tag) extends Table[Person](tag, "persons")
{
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def * = (id, name) <> (Person.tupled, Person.unapply)
def fields = PersonFields.all.filter(_.personID === id).flatMap(_.fieldFK)
}
object Persons
{
lazy val all = TableQuery[Persons]
}
Run Code Online (Sandbox Code Playgroud)
领域:
case class Field(id: …
Run Code Online (Sandbox Code Playgroud) 如果我想在Slick 3.x中使用编译时间查询,我需要使用tsql在每个类中声明一个StaticDatabaseConfig注释.
有没有办法避免这种情况并设置全局配置?
@StaticDatabaseConfig("file:src/main/resources/application.conf#tsql")
object PersistenceService {
val database = Database.forConfig("database")
database.run( tsql"SELECT NOW()" )
}
Run Code Online (Sandbox Code Playgroud) 在光滑中使用circe来获取json中的数据时,我可以获取(Timestamp/DateTime)
实体中没有日期字段的数据.但是当我Timestamp
在实体中使用字段时,会抛出错误:
[error] /var/www/html/scala-api/src/main/scala/oc/api/http/routes/TestApi.scala:40: could not find implicit value for parameter encoder: io.circe.Encoder[Seq[oc.api.models.UserEntity]]
[error] auth => complete(userDao.getAll().map(_.asJson))
Run Code Online (Sandbox Code Playgroud)
这是代码,我用于Slick Entities并使用CIRCE进行json编码.
BaseTable:
abstract class BaseTable[T](tag: Tag, name: String) extends Table[T](tag, name) {
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def createdAt = column[Timestamp]("created_at")
def updatedAt = column[Timestamp]("updated_at")
def deletedAt = column[Timestamp]("deleted_at")
}
Run Code Online (Sandbox Code Playgroud)
BaseEntity:
trait BaseEntity {
val id : Long
def isValid : Boolean = true
}
Run Code Online (Sandbox Code Playgroud)
UserEntity:createdAt生成编码器错误
case class UserEntity(id: Long, email: String, password: String, createdAt: Timestamp) extends BaseEntity …
Run Code Online (Sandbox Code Playgroud) 如何在 for-comprehension 中为语句添加调试点?
for {
a <- sqlQuery1()
b <- sqlQuery2()
} yield {
// output
}
Run Code Online (Sandbox Code Playgroud)
我想在执行上述每个查询时进行检查,但简单地添加调试点似乎不起作用。查询被执行而不会碰到调试点。我不确定这是否是正在使用的库、语言或 IDE 的限制。
这是我的设置:
更新:
案例 1:光滑
调试点不起作用。再次确认了这一点。
案例 2:不光滑
调试器会在调试点停止。但有时它会评估表达式,有时则不会。我注意到以下问题(在柯里化/匿名函数中):
实际上搜索时没有使用 slick as 关键字告诉我,很多人都有类似的问题,比如这里。
slick-3.0 ×10
scala ×9
slick ×6
akka ×1
akka-stream ×1
circe ×1
hikaricp ×1
join ×1
json ×1
mysql ×1
postgresql ×1
scalaquery ×1
t-sql ×1
typesafe ×1