2

ScalaQuery と Squerylの比較で、Stefan Zeiger (ScalaQuery の作者) は 3 番目の箇条書きで次のように述べています。

ScalaQuery は JDBC 型の基本セットをサポートしており、DBMS 固有またはアプリケーション固有の型で拡張できます。

ただし、実際にこれを行う方法の例や説明を見つけることができませんでした。Postgres データベース用の ScalaQuery スキーマを作成しようとしています。このスキーマでは、Postgres 内で作成したカスタム列挙型の列がいくつかあります。

たとえば、gender可能な値maleとを持つ という列挙型がありfemaleます。これは Java 列挙型ではなく、整数としてデータベースに永続化されます。むしろ、DBMS 内で定義されたカスタム Postgres タイプです。Postgres は、これらをプリミティブとしてではなく、特別な 4 バイトのデータ構造で保存します。

genderタイプの Postgres 列をScalaQuery スキーマ に組み込むにはどうすればよいですか?

(また、別の強く型付けされた O/R アプローチがタスクにより適していると思われる場合は、コメントをいただければ幸いです。私は既に Squeryl を見てきましたが、カスタム型がプリミティブとして永続化されていない限り、カスタム型を処理できるとは考えていません。 DBMS)。

4

1 に答える 1

3
import org.scalaquery.ql.{MappedTypeMapper => Mapper}

object TypeMapper {

  type Stamp = java.sql.Timestamp

  val joda2Stamp = 
    Mapper.base[JodaTime, Stamp](
      dt => new Stamp(dt.getMillis), 
      ts => new JodaTime(ts.getTime) )
}

次に、たとえば、DAO (またはクエリを実行する場所) で、次のように使用します。

import TypeMapper._
implicit val j2Stamp = joda2Stamp // type conversion automatically

Enums と PostGres の enum ストレージ タイプで同じことを達成するには、実験する必要があります。私は気にしない傾向があり、Java Enums を使用してプリミティブ型として格納することを好みます。

例えば:

public enum CardType implements ILabel {
  V("Visa"),
  M("MasterCard"),
  D("Discover"),
  A("American Express");

  private CardType(String label) { this.label = label; }
  public String getLabel() { return this.label; }
  final String label;

  public static List<String> asList() {
    return EnumHelper.asList(CardType.class);
  }

  public static Map<String,String> asMap() {
    return EnumHelper.asMap(CardType.class);
  }
}

char(1) として DB a la に保存Orders.insert(cardType = cardType.toString)するか、型マッパー Enum-String 変換を作成して、挿入時に enum.toString を省略できます...

于 2012-06-21T12:21:11.647 に答える