1

我对 Scala 和 Slick 还很陌生,并试图了解我的概念。我想知道如何使用一个命令在此处保存多个表。即我有一个包含文件夹和消息表的电子邮件系统。我的文件夹表可以有很多消息。我想保存一个文件夹,所有的消息都可以自己保存。像休眠一样,我们指定映射,它会根据我们的关系和映射处理多次保存、删除或更新。

提前感谢您的时间。

4

1 回答 1

3

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。但它使您可以更好地控制代码的作用和时间。

于 2013-07-21T19:50:30.983 回答