2013-07-20 39 views
1

我是Scala和Slick的新手,嘗試吸取我的概念。我想知道如何用一個命令在這裏保存多個表。即我有一個具有文件夾和消息表的電子郵件系統。我的文件夾表可以有很多消息。我想保存一個文件夾,並可以保存所有的信息。像hibernate這樣的地方,我們指定了映射,它根據我們的關係和映射關注多個保存或刪除或更新。如何在Slick中一次保存多個請求

感謝您的時間提前。

回答

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 

因此,不,slick不允許您自動執行某些操作,它更像是一個改進的SQL。但它可以讓您更好地控制代碼的功能和時間。

+0

感謝您的回答。我明白了。 –