SLICK 3.0(Scala)查询在多次运行之前不会返回数据(我认为)
问题描述
我对数据库、SLICK和Scala非常(非常)陌生,所以我使用了他们在http://slick.typesafe.com/doc/3.0.0/gettingstarted.html
文档中的示例代码我的问题是,由于某些原因,我必须多次运行查询才能返回数据。在它返回结果之前,我必须至少重新运行3-4次。我使用for循环重新运行查询,它们也不一定每次都给我完全相同的结果。
如下所示创建两个表:
然后我使用
创建这些表我有两个文本文件中的实际数据,我使用缓冲阅读器对它们进行解析。
我将所有的药物ID存储在一个名为DrugIds
然后,我开始按以下方式填表
我首先填写患者表:
对于DrugEffect表,我执行以下操作:
然后我使用以下代码段运行查询
这应该只给我提供患者表中的所有数据,但它不一定会这样做。
有时,我会收到以下错误(但并非总是):
如果我运行一个更复杂的查询,我得到的数据与查询的参数是准确的,但同样的问题也会出现,即结果重复、不存在或不完整(当我多次重新运行查询时)。
如果可以,就像我5岁一样解释,或者给我介绍一个可以帮助我解决这些问题的资源
编辑:
bjfletcher的回答起作用了(谢谢!),但现在我有另一个问题:
每隔一段时间,代码就会失败,并显示错误:
并不总是发生,但经常发生,我不知道这意味着什么
推荐答案
所有数据库调用都将使用Futures
立即返回,即使它们尚未完成操作。这是异步的,不是同步的。
您可以通过以下两种方式之一更改代码以适应Futures
:
您可以对所有数据库调用使用
Await.result
,以在该点等待,直到它们完成,例如:Await.result(db.run(insertEffect), Duration.Inf)
您可以使用
.map
(或者.flatMap
,如果您从内部使用另一个Future
),以及您希望在DB操作完成时运行的代码。例如:db.run(insertEffect).map(_ => ... do stuff... )
查看有关该异常的另一个堆栈溢出thread,并了解一些原因。
这篇关于SLICK 3.0(Scala)查询在多次运行之前不会返回数据(我认为)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!