2013-07-20 2 views
1

저는 Scala와 Slick에 익숙하지 않고 제 개념을 픽업하려고합니다. 한 명령으로 여러 테이블을 어떻게 저장할 수 있을지 궁금합니다. 즉, 폴더 및 메시지 테이블이있는 전자 메일 시스템이 있습니다. 내 폴더 테이블은 많은 메시지를 가질 수 있습니다. 나는 폴더를 저장하고 싶고 모든 메시지를 자신의 폴더에 저장할 수 있습니다. 우리가 맵핑을 지정하는 hibernate와 같은 것, 우리의 관계와 맵핑에 기반한 다중 저장이나 삭제 또는 갱신을 할 수 있습니다.Slick에서 여러 테이크를 한꺼번에 저장하는 방법

미리 감사드립니다.

답변

3

Slick은 최대 절전 모드와 같은 기존의 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 (?, ?, ?) 
,210

메시지

DELETE FROM Message WHERE ID = ? 

당신은 아이디어를 얻을를 삭제합니다.

이제 Slick에서는 이러한 정확한 연산을 스칼라에서 직접 수행 할 수 있습니다.

먼저 우리가 다음 우리는 테이블 정의

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() 

을 만들 그리고 지금 우리가 매끄러운을 사용하기 전에에서 질의를 할 수있는 모델

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

을 만들 수 있습니다. 예 :

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을 더 많이 사용합니다. 하지만 코드가 수행하는 작업과 작업을 제어 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 나는 그 개념을 가지고있다. –

관련 문제