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을 더 많이 사용합니다. 하지만 코드가 수행하는 작업과 작업을 제어 할 수 있습니다.
답변 해 주셔서 감사합니다. 나는 그 개념을 가지고있다. –