Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Slick 3.0(scala)查询不';在多次运行之前不要返回数据(我认为)_Mysql_Scala_Slick_Slick 3.0 - Fatal编程技术网

Mysql Slick 3.0(scala)查询不';在多次运行之前不要返回数据(我认为)

Mysql Slick 3.0(scala)查询不';在多次运行之前不要返回数据(我认为),mysql,scala,slick,slick-3.0,Mysql,Scala,Slick,Slick 3.0,所以我对数据库、slick和scala非常(非常)陌生,所以我使用了他们的文档中的示例代码 我的问题是,出于某种原因,我必须在查询返回数据之前运行多次。在返回结果之前,我必须重新运行它至少3-4次。我使用for循环来重新运行查询,它们也不一定每次都给出完全相同的结果 要创建两个表,请执行以下操作: class Patients(tag: Tag) extends Table[(String, String, Int, String)](tag, "Patientss") { def

所以我对数据库、slick和scala非常(非常)陌生,所以我使用了他们的文档中的示例代码

我的问题是,出于某种原因,我必须在查询返回数据之前运行多次。在返回结果之前,我必须重新运行它至少3-4次。我使用for循环来重新运行查询,它们也不一定每次都给出完全相同的结果

要创建两个表,请执行以下操作:

  class Patients(tag: Tag) extends Table[(String, String, Int, String)](tag, "Patientss") {
    def PID = column[String]("Patient Id", O.PrimaryKey)

    def Gender = column[String]("Gender")

    def Age = column[Int]("Age")

    def Ethnicity = column[String]("Ethnicity")

    def * = (PID, Gender, Age, Ethnicity)
  }

  val patientsss = TableQuery[Patients]

  class DrugEffect(tag: Tag) extends Table[(String, String, Double)](tag, "DrugEffectss") {

    def DrugID = column[String]("Drug ID", O.PrimaryKey)

    def PatientID = column[String]("Patient_ID")

    def DrugEffectssss = column[Double]("Drug Effect")

    def * = (DrugID, PatientID, DrugEffectssss)

    def Patient = foreignKey("Patient_FK", PatientID, patientsss)(_.PID)}

 val d_effects = TableQuery[DrugEffect]
然后,我使用

  val create_empty = DBIO.seq((patientsss.schema ++ d_effects.schema).create)
  val setup_1 = db.run(create_empty)
我有两个文本文件中的实际数据,我通过使用缓冲读取器来解析它们。 我将所有药物ID存储在一个列表中,该列表创造性地命名为
DrugIds

然后,我开始按以下方式填写表格

我首先填写患者表:

   while (switch != 1) {

    val Patient = CurPatient.split("\\s+")

    if (Patient(2).toUpperCase() == "NA" || (Patient(2).toFloat % 1 != 0))
      age = -1
    else age = Patient(2).toInt

    val insertPatient: DBIO[Option[Int]] = patientsss ++= Seq(
      (Patient(0), Patient(1), age, Patient(3))
    )       

    var future = db.run(insertPatient)



    CurPatient = PatientReader.readLine()

    if (CurPatient == null)
      switch = 1 //switch to 1

  }
对于DrugEffects表,我执行以下操作:

 while (switch != 1) {

    val Effect = CurEffect.split("\\s+")

    for (i <- 1 until DrugIds.size - 1) {
      if (Effect(i).toUpperCase() == "NA")
        d_ef = -1.00

      else d_ef = (Effect(i).toFloat).asInstanceOf[Double]


      val insertEffect: DBIO[Option[Int]] = d_effects ++= Seq(
        (DrugIds(i), Effect(0), d_ef)
      )
      var future2 = db.run(insertEffect)
    }


    CurEffect = EffectReader.readLine()

    if (CurEffect == null)
      switch = 1
  }
如果我运行一个更复杂的查询,我得到的数据与查询的参数是准确的,但同样的问题也会出现,即结果要么重复,要么不存在,要么不完整(当我多次重新运行查询时)

如果可以的话,请像我5岁一样解释,或者给我指一个可以帮助我解决这些问题的资源

编辑:

bjfletcher的回答有效(谢谢!),但现在我有另一个问题:

每隔一段时间,代码就会失败,并出现以下错误:

    Exception in thread "main" org.h2.jdbc.JdbcSQLException: Table "Patientss" not found; SQL statement:
insert into "Patientss" ("Patient Id","Gender","Age","Ethnicity")  values (?,?,?,?) [42102-162]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
    at org.h2.message.DbException.get(DbException.java:169)
    at org.h2.message.DbException.get(DbException.java:146)
    at org.h2.command.Parser.readTableOrView(Parser.java:4758)
    at org.h2.command.Parser.readTableOrView(Parser.java:4736)
    at org.h2.command.Parser.parseInsert(Parser.java:954)
    at org.h2.command.Parser.parsePrepared(Parser.java:375)
    at org.h2.command.Parser.parse(Parser.java:279)
    at org.h2.command.Parser.parse(Parser.java:251)
    at org.h2.command.Parser.prepareCommand(Parser.java:217)
    at org.h2.engine.Session.prepareLocal(Session.java:415)
    at org.h2.engine.Session.prepareCommand(Session.java:364)
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1121)
    at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:71)
    at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:267)
    at slick.jdbc.JdbcBackend$SessionDef$class.prepareStatement(JdbcBackend.scala:252)
    at slick.jdbc.JdbcBackend$BaseSession.prepareStatement(JdbcBackend.scala:386)
    at slick.jdbc.JdbcBackend$SessionDef$class.withPreparedStatement(JdbcBackend.scala:301)
    at slick.jdbc.JdbcBackend$BaseSession.withPreparedStatement(JdbcBackend.scala:386)
    at slick.driver.JdbcInsertInvokerComponent$BaseInsertInvoker.preparedInsert(JdbcInsertInvokerComponent.scala:177)
    at slick.driver.JdbcInsertInvokerComponent$BaseInsertInvoker$$anonfun$internalInsertAll$1.apply(JdbcInsertInvokerComponent.scala:201)
    at slick.jdbc.JdbcBackend$BaseSession.withTransaction(JdbcBackend.scala:422)
    at slick.driver.JdbcInsertInvokerComponent$BaseInsertInvoker.internalInsertAll(JdbcInsertInvokerComponent.scala:198)
    at slick.driver.JdbcInsertInvokerComponent$BaseInsertInvoker.insertAll(JdbcInsertInvokerComponent.scala:194)
    at slick.driver.JdbcInsertInvokerComponent$InsertInvokerDef$class.$plus$plus$eq(JdbcInsertInvokerComponent.scala:73)
    at slick.driver.JdbcInsertInvokerComponent$BaseInsertInvoker.$plus$plus$eq(JdbcInsertInvokerComponent.scala:152)
    at slick.driver.JdbcActionComponent$InsertActionComposerImpl$$anonfun$$plus$plus$eq$1.apply(JdbcActionComponent.scala:459)
    at slick.driver.JdbcActionComponent$InsertActionComposerImpl$$anonfun$$plus$plus$eq$1.apply(JdbcActionComponent.scala:459)
    at slick.driver.JdbcActionComponent$InsertActionComposerImpl$$anon$8.run(JdbcActionComponent.scala:449)
    at slick.driver.JdbcActionComponent$InsertActionComposerImpl$$anon$8.run(JdbcActionComponent.scala:447)
    at slick.backend.DatabaseComponent$DatabaseDef$$anon$2.liftedTree1$1(DatabaseComponent.scala:231)
    at slick.backend.DatabaseComponent$DatabaseDef$$anon$2.run(DatabaseComponent.scala:231)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
线程“main”org.h2.jdbc.JdbcSQLException中的异常:未找到表“Patientss”;SQL语句: 在“患者”中插入(“患者Id”、“性别”、“年龄”、“种族”)值(?、、?、?)[42102-162] 位于org.h2.message.DbException.getJdbcSQLException(DbException.java:329) 位于org.h2.message.DbException.get(DbException.java:169) 位于org.h2.message.DbException.get(DbException.java:146) 位于org.h2.command.Parser.readTableOrView(Parser.java:4758) 位于org.h2.command.Parser.readTableOrView(Parser.java:4736) 位于org.h2.command.Parser.parseInsert(Parser.java:954) 位于org.h2.command.Parser.parsePrepared(Parser.java:375) 位于org.h2.command.Parser.parse(Parser.java:279) 位于org.h2.command.Parser.parse(Parser.java:251) 位于org.h2.command.Parser.prepareCommand(Parser.java:217) 位于org.h2.engine.Session.prepareLocal(Session.java:415) 位于org.h2.engine.Session.prepareCommand(Session.java:364) 位于org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1121) 在org.h2.jdbc.JdbcPreparedStatement。(JdbcPreparedStatement.java:71) 位于org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:267) 在slick.jdbc.jdbcbbackend$SessionDef$class.prepareStatement(jdbcbbackend.scala:252) 在slick.jdbc.JdbcBackend$BaseSession.prepareStatement(JdbcBackend.scala:386)上 在slick.jdbc.JdbcBackend$SessionDef$class.withPreparedStatement(JdbcBackend.scala:301)上 在slick.jdbc.JdbcBackend$BaseSession.withPreparedStatement(JdbcBackend.scala:386)上 在slick.driver.jdbcinertinvokercomponent$BaseInsertInvoker.preparedInsert(jdbcinertinvokercomponent.scala:177) 在slick.driver.jdbinsertinvokercomponent$BaseInsertInvoker$$anonfun$internalInsertAll$1.apply(jdbinsertinvokercomponent.scala:201) 在slick.jdbc.JdbcBackend$BaseSession.withTransaction上(JdbcBackend.scala:422) 在slick.driver.jdbcinertinvokercomponent$BaseInsertInvoker.internalInsertAll(jdbcinertinvokercomponent.scala:198) 在slick.driver.jdbcinertinvokercomponent$BaseInsertInvoker.insertAll(jdbcinertinvokercomponent.scala:194) 在slick.driver.jdbcinertinvokercomponent$InsertInvokerDef$class.$plus$plus$eq(jdbcinertinvokercomponent.scala:73) 在slick.driver.jdbcinertinvokercomponent$BaseInsertInvoker.$plus$plus$eq(jdbcinertinvokercomponent.scala:152) 在slick.driver.jdbActionComponent$insertActionComposer impl$$anonfun$$plus$plus$eq$1.apply(jdbActionComponent.scala:459) 在slick.driver.jdbActionComponent$insertActionComposer impl$$anonfun$$plus$plus$eq$1.apply(jdbActionComponent.scala:459) 在slick.driver.jdbActionComponent$insertActionComposer impl$$anon$8.run(jdbActionComponent.scala:449) 在slick.driver.jdbActionComponent$insertActionComposer impl$$anon$8.run(jdbActionComponent.scala:447) 在slick.backend.DatabaseComponent$DatabaseDef$$anon$2.liftedTree1$1(DatabaseComponent.scala:231) 在slick.backend.DatabaseComponent$DatabaseDef$$anon$2.run(DatabaseComponent.scala:231) 位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 运行(Thread.java:745)
不是一直都会发生,但经常发生,我不知道这意味着什么

所有DB调用都会立即返回到您的
Futures
,即使它们尚未完成操作。这是异步的,不是同步的

您可以通过以下两种方式之一更改代码以适应
未来

  • 您可以对所有数据库调用使用
    wait.result
    ,在该点等待,直到它们完成,例如:
    wait.result(DB.run(insertEffect)、Duration.Inf)

  • 您可以使用
    .map
    (或
    .flatMap
    ,如果您从内部使用另一个
    未来
    ),以及您希望在DB操作完成时运行的代码。例如:
    db.run(insertEffect).map(=>…dostuff…)


  • 查看另一个有关异常的堆栈溢出,并了解其原因。

    所有DB调用都将立即返回到您的
    Futures
    ,即使它们尚未完成操作。这是异步的,不是同步的

    您可以通过以下两种方式之一更改代码以适应
    未来

  • 您可以对所有数据库调用使用
    wait.result
    ,在该点等待,直到它们完成,例如:
    wait.result(DB.run(insertEffect)、Duration.Inf)

  • java.util.concurrent.RejectedExecutionException: Task slick.backend.DatabaseComponent$DatabaseDef$$anon$3@47089c2c rejected from java.util.concurrent.ThreadPoolExecutor@6453123[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 215]
    at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2048)
    at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:821)
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1372)
    at scala.concurrent.impl.ExecutionContextImpl$$anon$1.execute(ExecutionContextImpl.scala:136)
    at slick.backend.DatabaseComponent$DatabaseDef$class.scheduleSynchronousStreaming(DatabaseComponent.scala:253)
    at slick.jdbc.JdbcBackend$DatabaseDef.scheduleSynchronousStreaming(JdbcBackend.scala:38)
    at slick.backend.DatabaseComponent$BasicStreamingActionContext.restartStreaming(DatabaseComponent.scala:516)
    at slick.backend.DatabaseComponent$BasicStreamingActionContext.request(DatabaseComponent.scala:531)
    at slick.backend.DatabasePublisher$$anon$3$$anonfun$onNext$2.apply(DatabasePublisher.scala:50)
    at slick.backend.DatabasePublisher$$anon$3$$anonfun$onNext$2.apply(DatabasePublisher.scala:49)
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
    at scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:121)
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.pollAndExecAll(ForkJoinPool.java:1253)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1346)
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
    
        Exception in thread "main" org.h2.jdbc.JdbcSQLException: Table "Patientss" not found; SQL statement:
    insert into "Patientss" ("Patient Id","Gender","Age","Ethnicity")  values (?,?,?,?) [42102-162]
        at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
        at org.h2.message.DbException.get(DbException.java:169)
        at org.h2.message.DbException.get(DbException.java:146)
        at org.h2.command.Parser.readTableOrView(Parser.java:4758)
        at org.h2.command.Parser.readTableOrView(Parser.java:4736)
        at org.h2.command.Parser.parseInsert(Parser.java:954)
        at org.h2.command.Parser.parsePrepared(Parser.java:375)
        at org.h2.command.Parser.parse(Parser.java:279)
        at org.h2.command.Parser.parse(Parser.java:251)
        at org.h2.command.Parser.prepareCommand(Parser.java:217)
        at org.h2.engine.Session.prepareLocal(Session.java:415)
        at org.h2.engine.Session.prepareCommand(Session.java:364)
        at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1121)
        at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:71)
        at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:267)
        at slick.jdbc.JdbcBackend$SessionDef$class.prepareStatement(JdbcBackend.scala:252)
        at slick.jdbc.JdbcBackend$BaseSession.prepareStatement(JdbcBackend.scala:386)
        at slick.jdbc.JdbcBackend$SessionDef$class.withPreparedStatement(JdbcBackend.scala:301)
        at slick.jdbc.JdbcBackend$BaseSession.withPreparedStatement(JdbcBackend.scala:386)
        at slick.driver.JdbcInsertInvokerComponent$BaseInsertInvoker.preparedInsert(JdbcInsertInvokerComponent.scala:177)
        at slick.driver.JdbcInsertInvokerComponent$BaseInsertInvoker$$anonfun$internalInsertAll$1.apply(JdbcInsertInvokerComponent.scala:201)
        at slick.jdbc.JdbcBackend$BaseSession.withTransaction(JdbcBackend.scala:422)
        at slick.driver.JdbcInsertInvokerComponent$BaseInsertInvoker.internalInsertAll(JdbcInsertInvokerComponent.scala:198)
        at slick.driver.JdbcInsertInvokerComponent$BaseInsertInvoker.insertAll(JdbcInsertInvokerComponent.scala:194)
        at slick.driver.JdbcInsertInvokerComponent$InsertInvokerDef$class.$plus$plus$eq(JdbcInsertInvokerComponent.scala:73)
        at slick.driver.JdbcInsertInvokerComponent$BaseInsertInvoker.$plus$plus$eq(JdbcInsertInvokerComponent.scala:152)
        at slick.driver.JdbcActionComponent$InsertActionComposerImpl$$anonfun$$plus$plus$eq$1.apply(JdbcActionComponent.scala:459)
        at slick.driver.JdbcActionComponent$InsertActionComposerImpl$$anonfun$$plus$plus$eq$1.apply(JdbcActionComponent.scala:459)
        at slick.driver.JdbcActionComponent$InsertActionComposerImpl$$anon$8.run(JdbcActionComponent.scala:449)
        at slick.driver.JdbcActionComponent$InsertActionComposerImpl$$anon$8.run(JdbcActionComponent.scala:447)
        at slick.backend.DatabaseComponent$DatabaseDef$$anon$2.liftedTree1$1(DatabaseComponent.scala:231)
        at slick.backend.DatabaseComponent$DatabaseDef$$anon$2.run(DatabaseComponent.scala:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)