首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何运行使用Play Framework应用数据库的comand行scala脚本?

如何运行使用Play Framework应用数据库的comand行scala脚本?
EN

Stack Overflow用户
提问于 2014-05-10 15:59:32
回答 3查看 1.6K关注 0票数 3

我把这个放在我的app/scripts文件夹上(我在app/中创建了这个文件夹)。我不知道如何在这里正确地设置类路径,因此我甚至没有运行它来知道它是否会真正连接到数据库。如何在命令行中以干净的方式运行?

代码语言:javascript
运行
复制
package scripts

import scala.collection.TraversableOnce
import scala.collection.generic.SeqForwarder
import scala.io.Source
import scala.slick.jdbc.{StaticQuery => Q}
import scala.slick.session.Session
import scala.slick.session.Database
import play.api.db.DB
import tables.Campeonatos
import tables.Jogos
import org.postgresql.Driver
import play.api.test._
import play.api.test.Helpers._

// ...

class InsertJogosCSV extends App {
  val dao = new DAO()
  val application = FakeApplication()

  def insertJogos(csv: CSV)(implicit s: Session) = {
    val times = dao.getTimeIdByNameMap
    var count = 0
    csv foreach { case cols =>
      count += 1
      dao.insertJogo(cols, times)
    }
    count
  }

  val csvFilePath: String = args(0)
  val csv = new CSV(csvFilePath)
  csv.printLines
  running(application) {
    val realDatabase = Database.forDataSource(DB.getDataSource()(application))
    implicit val s = realDatabase.createSession
    insertJogos(csv)
  }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-10 17:59:20

您可以通过在应用程序根目录下使用play test:console命令来实现这一点。首先,您可能会将代码移动到主方法中,而不是扩展App

代码语言:javascript
运行
复制
class InsertJogosCSV {
    def main(args: Array[String]) {
        val dao = new DAO()
        val application = FakeApplication()

        def insertJogos(csv: CSV)(implicit s: Session) = {....}

        ....
    }
}

然后运行play test:console命令并执行以下操作

代码语言:javascript
运行
复制
scala> import scripts.InsertJogosCSV
import scripts.InsertJogosCSV

scala> val insert = new InsertJogosCSV()
insert: scripts.InsertJogosCSV = scripts.InsertJogosCSV@7d5f9d2b

scala> insert.main
res0: .....

默认情况下,play test:console会添加从app文件夹到类路径的所有内容,以及脚本所需的FakeApplication上下文。希望这能有所帮助。

类似问题:https://stackoverflow.com/a/11297578/2556428

票数 1
EN

Stack Overflow用户

发布于 2014-05-15 03:27:29

我写了一篇博文,解释了我的最后解决方案。应该作为这个问题的答案。

http://blog.felipe.rs/2014/05/15/run-maintenance-scripts-in-the-context-of-a-running-play-framework-application/

票数 4
EN

Stack Overflow用户

发布于 2015-06-02 07:59:33

我正在使用另一种方法,用于类似的任务。

在主框架项目中创建空子项目。

在build.sbt中,它看起来像

代码语言:javascript
运行
复制
// Main project
lazy val root = (project in file(".")).enablePlugins(play.PlayScala).enablePlugins(com.typesafe.sbt.web.SbtWeb)
// Utils sbt project with scripts
lazy val sjutil = project.aggregate(root).dependsOn(root)

和sjutil/build.sbt类似于正常的sbt项目,如果需要额外的deps,对我来说是akka-remote

代码语言:javascript
运行
复制
name := "sjutil"

version := "1.0-SNAPSHOT"

scalaVersion := "2.11.1"

libraryDependencies +=   "com.typesafe.akka" %% "akka-remote" % "2.3.4"

您可以将一些应用程序直接放到sjutil/文件夹中

sjutil/actorsstarter.scala:

代码语言:javascript
运行
复制
object actorsstarter {
  lazy val logger = play.api.Logger("actorsstarter")
  def main(args: Array[String]) {
     // read config from conf/application.conf of main project
     val remoteConfig = ConfigFactory.load.getConfig("botstarter")

     val system = ActorSystem("application",remoteConfig)
     val path = "akka.tcp://application@127.0.0.1:2553/user"
     ....
     logger.info("Started")
  }
}

之后,您可以使用以下方法运行此脚本:

代码语言:javascript
运行
复制
./activator sjutil/run 

做所有你能做的与正常的项目:舞台,区域等等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23583244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档