2016-09-08 5 views
0

私はテーブルにautoincフラグを持たずに要素をdatabseに簡単に挿入しようとしています。ここでSlick 3.1.1 AutoIncなしのデータベースへの要素の挿入

テーブル定義ですが、私は定義されている適切なマッパーのすべてを持っている:

class BlockHeaderTable(tag: Tag) extends Table[BlockHeader](tag,"block_headers") { 

    def hash = column[DoubleSha256Digest]("hash", O.PrimaryKey) 

    def version = column[UInt32]("version") 

    def previousBlockHash = column[DoubleSha256Digest]("previous_block_hash") 

    def merkleRootHash = column[DoubleSha256Digest]("merkle_root_hash") 

    def time = column[UInt32]("time") 

    def nBits = column[UInt32]("n_bits") 

    def nonce = column[UInt32]("nonce") 

    def * = (hash, version, previousBlockHash, merkleRootHash, time, nBits, nonce).<>[BlockHeader, 
    (DoubleSha256Digest, UInt32, DoubleSha256Digest, DoubleSha256Digest, UInt32, UInt32, UInt32)](blockHeaderApply,blockHeaderUnapply) 
} 

私はこのテーブルのためのシンプルなinsert関数を作成しようとしています。ここに私の試みは次のとおりです。

override val table = TableQuery[BlockHeaderTable] 

    def create(blockHeader: BlockHeader): Future[BlockHeader] = { 
    val insertAction = table += blockHeader 
    database.run(insertAction) 
    } 

と私はタイプのため、このエラーを取得しています:

[email protected]:~/dev/bitcoins-spv-node$ sbt compile 
[info] Loading project definition from /home/chris/dev/bitcoins-spv-node/project 
[info] Set current project to bitcoins-spv-node (in build file:/home/chris/dev/bitcoins-spv-node/) 
[info] Compiling 1 Scala source to /home/chris/dev/bitcoins-spv-node/target/scala-2.11/classes... 
[error] /home/chris/dev/bitcoins-spv-node/src/main/scala/org/bitcoins/spvnode/models/BlockHeaderDAO.scala:30: type mismatch; 
[error] found : slick.profile.FixedSqlAction[Boolean,slick.dbio.NoStream,slick.dbio.Effect.Write] 
[error] required: slick.dbio.DBIOAction[org.bitcoins.core.protocol.blockchain.BlockHeader,slick.dbio.NoStream,Nothing] 
[error]  database.run(insertAction) 
[error]    ^
[error] one error found 
[error] (compile:compileIncremental) Compilation failed 
[error] Total time: 3 s, completed Sep 8, 2016 2:11:32 PM 
+0

をinsertActionをどこで定義していますか? 'DBIOAction'から継承していないようですね? –

+0

'table'は単なる' TableQuery'オブジェクトで、 'blockHeader'は' table'が格納するオブジェクトのインスタンスです。 '+ ='は 'SimpleInsertActionComposer'の内部で定義されています –

+0

私は、insert文が' DBIO.seq'の外で使用できるかどうかが重要だと思います。 github.com/slick/slick/blob/898cb1871c610cea72027b266494f5bd83f770c9/slick-testkit/src/main/scala/com/typesafe/slick/testkit/tests/InsertTest.scala –

答えて

1

こと+=あなたの署名を満たすためにしかし、通常は1である、影響を受けた行数を返します機能を使用するには、BlockHeaderを返す必要があります。

def create(blockHeader: BlockHeader): Future[BlockHeader] = { 
    val insertion: DBIO[BlockHeader] = (table += blockHeader).andThen(DBIO.successful(blockHeader)) 
    database.run(insertAction) 
} 

andThenは、最初のアクションがsuceeded直後に実行され、2番目のアクションの値を返します:あなたは、単にあなたの「挿入」の値を返すDBIO.successful()アクションをチェーンによってこれを行うことができます。

returningと混同しないでください。 returningでは、+=++=が返す値を変更することができます。これは、ほとんどのDBMSでは、自動増分された単一の主キーのみを返すことを許可しています。 hashが自動インクリメント値だった場合たとえば、あなたはこのようにそれを返すことができます。

val hash = (table returning table.map(_.hash)) += blockHeader 

そしてさらに少し行くために、あなたもintoを使用して、あなたのBlockHeaderオブジェクトにその値を挿入することができます。

val blockHeaderWithHash = (table returning table.map(_.hash) into ((blockHeader, hash) => blockHeader.copy(hash = hash))) += blockHeader 
0

あなたinsertActionが挿入された行数を返しますので、あなたはその値とチェックの上にマッピングする必要があります操作が成功した場合:デフォルトでは

def create(blockHeader: BlockHeader): Future[BlockHeader] = { 
    val insertAction = (table += blockHeader).flatMap { 
    case 0 => DBIO.failed(new Exception("Failed to insert `BlockHeader` object")) 
    case _ => DBIO.successful(blockHeader) 
    } 

    db.run(insertAction) 
} 
関連する問題