我对 Scala 和 Slick 还很陌生,并试图了解我的概念。我想知道如何使用一个命令在此处保存多个表。即我有一个包含文件夹和消息表的电子邮件系统。我的文件夹表可以有很多消息。我想保存一个文件夹,所有的消息都可以自己保存。像休眠一样,我们指定映射,它会根据我们的关系和映射处理多次保存、删除或更新。
提前感谢您的时间。
Slick 比 hibernate 等传统的 ORM 工具更接近数据库引擎。那么我们如何在没有 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()
现在我们可以在使用 slick 之前进行查询。例如:
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。但它使您可以更好地控制代码的作用和时间。