我是Scala和Slick的新手,并试图提升我的概念。我想知道如何用一个命令在这里保存多个表。即我有一个电子邮件系统,其中包含文件夹和邮件表。我的文件夹表可以有很多消息。我想保存文件夹,并且可以将所有消息保存在自己的文件夹中。像hibernate这样的东西,我们在其中指定映射,并根据我们的关系和映射进行多次保存或删除或更新。
感谢您的提前时间。
答案 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。但它可以让您更好地控制代码的作用和时间。