如何在Slick中一次保存多个摄像头

时间:2013-07-20 14:33:59

标签: scala slick

我是Scala和Slick的新手,并试图提升我的概念。我想知道如何用一个命令在这里保存多个表。即我有一个电子邮件系统,其中包含文件夹和邮件表。我的文件夹表可以有很多消息。我想保存文件夹,并且可以将所有消息保存在自己的文件夹中。像hibernate这样的东西,我们在其中指定映射,并根据我们的关系和映射进行多次保存或删除或更新。

感谢您的提前时间。

1 个答案:

答案 0 :(得分:3)

Slick比传统的ORM工具(如hibernate)更接近数据库引擎。那么我们如何在没有ORM的传统数据库引擎中解决这个问题?

使用SQL:

我们将创建包含有关文件夹和消息的信息的表

CREATE TABLE Folder (
    ID int not null primary key autoincrement,
    Name string not null
    --etc
)
CREATE TABLE Message (
    ID int not null primary key autoincrement,
    FolderID int not null foreign key references Folder(ID),
    Sender string not null,
    Content string not null
    --etc
)

现在我们想对这些表做些什么? 我们可能想要显示所有文件夹的列表

SELECT ID, Name FROM Folder

我们希望显示给定文件夹中的所有邮件

SELECT ID, Sender, Content FROM Message WHERE FolderID = ?

我们想创建一个新文件夹

INSERT INTO Folder (Name) VALUES (?)

向指定文件夹添加消息

INSERT INTO Message (FolderID, Sender, Content) VALUES (?, ?, ?)

删除信息

DELETE FROM Message WHERE ID = ?

你明白了。

现在Slick允许您直接在scala中执行这些精确操作。

首先我们创建模型

case class Folder(id:Int, name:String)
case class Message(id:Int, folderID:Int, sender:String, content:String)

然后我们创建表定义

class FolderTbl extends Table[Folder]("Folder") {
  def id = column[Int]("ID", O.PrimaryKey, O.AutoInc)
  def name = column[String]("Name")
  def * = id ~ name <> (Folder.apply _, Folder.unapply _)
}
val FolderTbl = new FolderTbl()
class MessageTbl extends Table[Message]("Message") {
  def id = column[Int]("ID", O.PrimaryKey, O.AutoInc)
  def folderID = column[Int]("FolderID")
  def sender = column[String]("Sender")
  def content = column[String]("Content")
  def * = id ~ folderID ~ sender ~ content <> (Folder.apply _, Folder.unapply _)
  def folder = foreignKey("fk_msg_folder", folderID, FolderTbl)(_.id)
}
val MessageTbl = new MessageTbl()

现在我们可以在使用光滑之前进行查询了。例如:

val query = for {
  msg <- MessageTbl if msg.folderID === someFolder.ID
} yield msg
val lst : List[Message] query.list() //list all messages in a folder

所以不,光滑不允许你自动做事,它更像是一个改进的SQL。但它可以让您更好地控制代码的作用和时间。