我正在尝试ScalaQuery,这真的很棒.我可以使用Scala类定义数据库表,并轻松查询.
但是我想知道,在下面的代码中,我如何检查一个表是否存在,所以我不会两次调用'Table.ddl.create'并在我运行该程序两次时获得异常?
object Users extends Table[(Int, String, String)]("Users") {
def id = column[Int]("id")
def first = column[String]("first")
def last = column[String]("last")
def * = id ~ first ~ last
}
object Main
{
val database = Database.forURL("jdbc:sqlite:sample.db", driver = "org.sqlite.JDBC")
def main(args: Array[String]) {
database withSession {
// How could I know table Users is alrady in the DB?
if ( ??? ) {
Users.ddl.create
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 对于我的单元测试,我想设置一个数据库,用基本信息填充它,并在会话中运行每个测试,以回滚对数据库所做的所有更改,以便始终为每个测试提供一个原始副本.
我正在寻找类似的东西
db withSession {
<create my objects under test>
<run operations>
<run asserts>
this.rollback()
}
Run Code Online (Sandbox Code Playgroud)
回滚功能是在Scala Query的早期版本中,但它现在似乎缺失了.我该如何实现此功能?
最好的祝福
光滑,如何将查询映射到继承表模型?即
我有表A,B,CA是"父"表,B&C是"子"表我想知道的是我应该如何使用光滑模型这样A将是抽象和B&C具体类型,以及查询A中的行将导致B或C对象
像JPA那样的东西InheritanceType.TABLE_PER_CLASS.
我们如何在ScalaQuery中定义多主键和外键?
object myTable1 extends Table([Int])("myTable1") {
def id = column[Int]("id", O PrimaryKey)
def * = id
}
object myTable2 extends Table([Int, Int, Int])("myTable2") {
def pk1 = column[Int]("id1")
def pk2 = column[Int]("id2")
def fk1 = column[Int]("fk1")
def * = pk1 ~ pk2 ~ fk1
}
Run Code Online (Sandbox Code Playgroud)
那么如果我想让myTable2中的pk1和pk2成为主键,myTable2中的fk1引用myTable1中的id,那么使用的代码是什么?
这是我要执行的scalaquery查询,
...
def generateFares(scheduleId:NamedColumn[Int], toCityId:NamedColumn[Int], fromCityId:NamedColumn[Int]):List[(String,Int,String)] = {
var list:List[(String,Int,String)] = Nil;
val q = for {
tf <- ticketingDB.ticketFares if (( tf.scheduleId is scheduleId ) && ( tf.fromCityId is fromCityId ) && ( tf.toCityId is toCityId ))
tft <- ticketingDB.ticketFareType if tft.id is tf._7
}{
list = (tft._2, tf._5, tf._6)::list
}
list
}
...
Run Code Online (Sandbox Code Playgroud)
在这个连接中,我收到一个编译错误:
could not find implicit value for parameter session: org.scalaquery.session.Session
Run Code Online (Sandbox Code Playgroud)
在第二个电话中.(tft < - ticketingDB)
我无法理解scalaquery的这种行为.
ps:我可以保证在withSession块中调用该方法.
请帮我调试并创建无错连接.
我正在Scala开发一个全新的项目.它只是一堆CRUD操作的应用程序,但是,由于一些古怪的要求,Play2或Lift不符合要求,所以我将从头开始开发应用程序.这意味着Anorm或ScalaQuery成为数据库集成的不太明显的选择,让我有一个问题:是时候尝试新的东西了吗?
我过去的技术堆栈主要包括Java和PostgreSQL,我有ORM和纯SQL的经验.像MongoDB这样的NoSQL数据库管理系统是典型RDBMS的良好替代品,还是特殊情况的应用程序数据存储?此外,数据库的选择如何影响更大的Scala系统设计(如果有的话)?例如,您使用类似JSON的接口与数据库进行通信,以及Web和REST服务之间的JSON这一事实并不意味着如果中间的所有内容都成为Scala对象,或者它是什么?
我基本上要求有人从关系数据库转移到对象/文档类型数据库,特别是使用Scala.我知道即将发布的SLICK承诺提供良好的RDBMS集成.那么,如果像TypeSafe这样的公司决定在TypeSafe堆栈中建立RDBMS集成部分,那么我将使用Casbah集成到MongoDB上游吗?
如果这个问题看起来有点含糊,请道歉.我希望有正确见解或经验的人能够提供帮助.
更新:
不向SLICK添加链接的道歉(这是相当新的).开始:
更新2:
对于技术我个人的第一场胜利通常为开发人员的生产力 -这相当于轻巧简单:快速学习,容易维护,没有魔法
我使用了ScalaQuery和Scala.
如果我有一个Array [Byte]对象,我该如何将它插入表中?
object TestTable extends BasicTable[Test]("test") {
def id = column[Long]("mid", O.NotNull)
def extInfo = column[Blob]("mbody", O.Nullable)
def * = id ~ extInfo <> (Test, Test.unapply _)
}
case class Test(id: Long, extInfo: Blob)
Run Code Online (Sandbox Code Playgroud)
我可以使用def extInfo = column[Array[Byte]]("mbody", O.Nullable)BLOB类型字段定义使用的方法,如何操作(UPDATE,INSERT,SELECT)?
BTW:没有ScalaQuery标签
尝试删除一批记录时,只删除奇数行!
val byUser = Orders.createFinderBy(_.userID)
byUser(id).mutate(_.delete)
Run Code Online (Sandbox Code Playgroud)
如果我改为打印记录,我会得到正确的行数.
byUser(id).mutate{x => x.echo}
Run Code Online (Sandbox Code Playgroud)
我解决了这个问题,它生成了所需的SQL.
(for{o <- Orders if o.userID is id.bind } yield o).delete
Run Code Online (Sandbox Code Playgroud)
但是,mutate版本为何或如何仅影响奇数行?
在ScalaQuery中,我可以使用"原始"结果行:
for (
x <- queryNA[(String,Int)]("select * from foo")(
GetResult(r => (r.<<[String], r.<<[Int]))
)
) {
println(x)
}
Run Code Online (Sandbox Code Playgroud)
但这完全是位置的(r是a PositionedResult).有没有办法使用列名来处理结果?(例如,row.getString("foo").)
我可以使用另一个支持它的数据库API,比如Querulous,但我已经在我的代码中使用ScalaQuery进行类型安全查询,并且如果可能的话,我想坚持使用一个库.
以下函数工作正常,但我希望它首先按parent_id排序结果,然后按顺序排序.
def getTree = for {
(a, c) <- Activities leftJoin Clients on (_.id === _.id_a)
} yield (a.id, a.label, a.parent_id, a.order, c.id.?, a=c.name)
Run Code Online (Sandbox Code Playgroud)
我如何使用Slick做到这一点?