Pertanyaan Bagaimana cara memasukkan nilai UUID?


Saya menggunakan anorm 2.4 dalam kerangka bermain 2.3 postgresql yang didukung 9.4

Berikan model seperti ini:

case class EmailQueue(id:UUID,
                  send_from:String,
                  send_to:String,
                  subject:String,
                  body:String,
                  created_date:Date,
                  is_sent:Boolean,
                   email_template:String)

Ini adalah parser saya:

val parser: RowParser[EmailQueue] = {
get[UUID]("id") ~
  get[String]("send_from") ~
  get[String]("send_to") ~
  get[String]("subject") ~
  get[String]("body") ~
  get[Date]("created_date") ~
  get[Boolean]("is_sent") ~
  get[String]("email_template") map {
  case id ~ send_from ~ send_to ~ subject ~ body ~
    created_date ~ is_sent ~ email_template=> EmailQueue(id,
    send_from,
    send_to,
    subject,
    body,
    created_date,
    is_sent,
    email_template)
}

}

Dan ini adalah pernyataan insert saya:

def insert(email:EmailQueue): Unit ={
DB.withTransaction { implicit c =>
  SQL(s"""
        INSERT INTO "email_queue" ( "body", "created_date", "id", "is_sent", "send_from", "send_to", "subject", "email_template")
        VALUES ( {body}, {created_date}, {id}, {is_sent}, {send_from}, {send_to}, {subject}, {email_template} );
      """).on(
      "body" -> email.body,
      "created_date" -> email.created_date,
      "id" -> email.id,
      "is_sent" -> email.is_sent,
      "send_from" -> email.send_from,
      "send_to" -> email.send_to,
      "subject" -> email.subject,
      "email_template" -> email.email_template
    ).executeInsert()
}

}

Saya menerima kesalahan berikut saat memasukkan:

[error] PSQLException:: ERROR: kolom "id" adalah tipe uuid tapi   ekspresi adalah jenis karakter yang bervariasi [error] Petunjuk: Anda akan membutuhkannya   untuk menulis ulang atau mentransmisikan ekspresi. [error] Posisi: 153   (xxxxxxxxxx.java:2270)

Tabel basis data dibuat oleh kueri ini:

CREATE TABLE email_queue (
   id UUID PRIMARY KEY,
   send_from VARCHAR(255) NOT NULL,
   send_to VARCHAR(255) NOT NULL,
   subject VARCHAR(2000) NOT NULL,
   body text NOT NULL,
   created_date timestamp without time zone DEFAULT now(),
   is_sent BOOLEAN NOT NULL DEFAULT FALSE,
   email_template VARCHAR(2000) NOT NULL
);

5
2018-06-22 16:53


asal


Jawaban:


Anorm adalah DB agnostic, seperti JDBC, sehingga datatype spesifik vendor tidak didukung secara default.

Kamu dapat memakai {id}::uuid dalam pernyataan itu, sehingga java.util.UUID disahkan sebagai String dalam parameter JDBC kemudian diubah dari yang berlalu VARCHAR ke PostgreSQL tertentu uuid.

Menggunakan interpolasi string di SQL(s"...") tidak direkomendasikan (injeksi SQL), tetapi interpolasi Anorm dapat digunakan.

def insert(email:EmailQueue): Unit = DB.withTransaction { implicit c =>
  SQL"""
    INSERT INTO "email_queue" ( "body", "created_date", "id", "is_sent", "send_from", "send_to", "subject", "email_template")
    VALUES ( ${email.body}, ${email.created_date}, ${email.id}::uuid, ${email.is_sent}, ${email.send_from}, ${email.send_to}, ${email.subject}, ${email.email_template} )
  """).executeInsert()
}

Tidak direkomendasikan, tetapi dapat berguna terkadang untuk jenis khusus vendor, anorm.Object dapat digunakan untuk melewatkan nilai buram sebagai parameter JDBC (ada ::uuid lebih baik untuk saya).

Anda juga bisa menerapkan kebiasaan ToStatement[java.util.UUID].


6
2018-06-23 07:57