2017-02-16 12 views
2

既定では、SlickはO.AutoIncフラグの列の値を無視し、挿入操作中にデータベースにその値を入力させます。SlickでAutoInc列の値を明示的に指定する方法

しかし、時々私は自動インクリメントの列にいくつかの特定の値を挿入する必要があり、Slickはそれを無視します。それを行う方法はありますか?

私は知っている、私はO.AutoIncフラグなしで2番目のテーブルの定義を行うことができますが、私はそれをよりエレガントな方法を探しています。

アップデート:ここに は、私の場合クラスとテーブル定義です:

case class Transaction (id: Long, timestamp: LocalDateTime, comment: Option[String]) 
class Transactions(tag: Tag) extends Table[Transaction](tag, "tx") { 
    implicit val localDTtoDate = MappedColumnType.base[LocalDateTime, Timestamp] (
    l => Timestamp.valueOf(l), 
    d => d.toLocalDateTime 
) 

    def id = column[Long]("id", O.PrimaryKey, O.AutoInc) 
    def timestamp = column[LocalDateTime]("ts") 
    def comment = column[Option[String]]("comment") 
    def * = (id, timestamp, comment) <> ((Transaction.apply _).tupled, Transaction.unapply) 
} 
+0

をあなたの '*' -PROJECTIONはIDを使用する場合は、これを行うことができますカラム。あなたのテーブル定義をコピー・ペーストできますか? – jkinkead

+0

@jkinkead – akashihi

答えて

0

あなたはOptionアルとしてあなたidフィールドをマークすると、あなたは*投影を微調整して挿入することができるはずです。

case class Transaction (id: Option[Long], timestamp: LocalDateTime, 
    comment: Option[String]) 
class Transactions(tag: Tag) extends Table[Transaction](tag, "tx") { 
    // Use the ? method on your id column to map it to an option. 
    def * = (id.?, timestamp, comment) <> (
    (Transaction.apply _).tupled, Transaction.unapply) 
} 

この場合、id=Noneで挿入した行はの行がに設定されている間に新しいidを生成します。挿入されたIDをリードバックするには、returning ... intoを使用します。非常によく似た問題で苦労しながら、

// `tx` is a Transaction instance, `transactions` is a 
// TableQuery[Transactions] instance. 
(transactions.returning(transactions.map(_.id)).into { (_, id) => 
    tx.copy(id = id) 
}) += tx 
+0

残念ながら、id:Option [Long]の値は、いずれも、Some(値)とNoneの両方で自動生成されます – akashihi

+0

どのように行を挿入していますか?どのデータベースを使用していますか?これはSlick 3. {0,1}とPostgreSQLで動作するはずです。 – jkinkead

+0

挿入コードは、理解の一部であり、関連する部分は次のとおりです。transactions.map(_。id)+ = txデータベースを返すトランザクションはPostgreSQL – akashihi

0

私はこの質問を見つけました。 悲しいことに、提案された解決策を実行することもできませんでした。

私たちは、それがために必要なときに私たちは、挿入中のidを省略O.AutoIncを手放すことにしましたが、

Column | Type |     Modifiers 
----------+--------+---------------------------------------------- 
id  | bigint | not null default nextval('id_seq'::regclass) 

その配列のnextvalする順序とカラムのデフォルト値を保持自動的に生成されます。ドキュメントの関連部分へ

リンク:この正確な場合 http://slick.lightbend.com/doc/3.1.0/queries.html#inserting

それはこのようなものになります。

if (you have an explicit id) transactions += tx 
else transactions.map(t => (t.timestamp, t.comment)) += (tx.timestamp, tx.comment)