2015-02-12 30 views
8

Vấn đề của tôi rất đơn giản.Chèn giá trị mặc định nếu giá trị cột là 'Không' bằng cách sử dụng trơn

Tôi có một cột seqNum: Double đó là NOT NULL DEFAULT 1 trong CREATE TABLE tuyên bố như sau:

CREATE TABLE some_table 
(
    ... 
    seq_num DECIMAL(18,10) NOT NULL DEFAULT 1, 
    ... 
); 

Người dùng có thể nhập giá trị cho seqNum hay không từ UI. Vì vậy, các PLAY hình thức chấp nhận là như:

case class SomeCaseClass(..., seqNum: Option[Double], ...) 
val secForm = Form(mapping(
    ... 
    "seqNum" -> optional(of[Double]), 
    ... 
)(SomeCaseClass.apply)(SomeCaseClass.unapply)) 

Bảng Schema trơn & Đối tượng trông như thế này:

case class SomeSection (
    ... 
    seqNum: Option[Double], 
    ... 
) 
class SomeSections(tag: Tag) extends Table[SomeSection](tag, "some_table") { 
    def * = (
     ... 
     seqNum.?, 
     ... 
    ) <> (SomeSection.tupled, SomeSection.unapply _) 

    ... 
    def seqNum = column[Double]("seq_num", O.NotNull, O.Default(1)) 
    ... 
} 
object SomeSections { 

    val someSections = TableQuery[SomeSections] 
    val autoInc = someSections returning someSections.map(_.sectionId) 

    def insert(s: someSection)(implicit session: Session) = { 
    autoInc.insert(s) 
    } 
} 

Khi tôi gửi seqNum từ giao diện người dùng, mọi thứ đều hoạt động tốt nhưng khi None là có , nó phá vỡ nói rằng không thể chèn NULL trong cột NOT NULL đó là chính xác. This question giải thích lý do.

Nhưng cách giải quyết vấn đề này bằng cách sử dụng slick? Không thể hiểu nơi tôi nên kiểm tra về None? Tôi đang tạo & gửi một đối tượng của SomeSection đến insert phương thức SomeSections Đối tượng.

Tôi đang sử dụng máy chủ sql, nếu nó quan trọng.

Trả lời

0

Hoặc bạn thực thi các Option truyền cho Slick bởi suffixing nó với một .getOrElse(theDefault), hoặc bạn làm cho DB chấp nhận NULL (từ một giá trị None) và mặc định nó sử dụng một số cò.

+2

Nếu tôi sử dụng '.getOrElse (theDefault)' thì giá trị mặc định được đặt trong khi tạo bảng sẽ không được sử dụng, vì tôi sẽ chuyển một thứ gì đó. –

+0

Việc truyền 'Không' sẽ không được chuyển. – cchantep

7

Sử dụng giá trị mặc định không yêu cầu phải chèn giá trị nào cả thay vì chèn NULL. Điều này có nghĩa là bạn sẽ cần một phép chiếu tùy chỉnh để chèn vào.

people.map(_.name).insert("Chris") sẽ sử dụng giá trị mặc định cho tất cả các trường khác. Những hạn chế của các biến đổi tuple nguyên gốc của scala và các phép biến đổi lớp vỏ có thể làm cho việc này trở nên rắc rối. Những thứ như Slick's HLists, Shapeless, Scala Records hoặc Scala XR có thể giúp, nhưng không tầm thường hoặc rất thử nghiệm vào lúc này.

Các vấn đề liên quan