I have written this code which works perfectly
class Items(tag: Tag) extends Table[Item](tag, "ITEMS") { def id = column[Long]("ITEMS_ID", O.PrimaryKey, O.AutoInc) def name = column[String]("ITEMS_NAME") def price = column[Double]("ITEMS_PRICE") def * = (id, name, price) <> ((Item.apply _).tupled, Item.unapply _) } object Shop extends Shop{ val items = TableQuery[Items] val db = Database.forConfig("h2mem1") def create(name: String, price: Double) : Int = { val action = items ++= Seq(Item(0, name, price)) val future1 = db.run(action) val future2 = future1 map {result => result map {x => x} } Await.result(future2, Duration.Inf).getOrElse(0) } }
This code works but the return value is number of records inserted. But I want to return the value of the AutoInc after the insert has been done.
i did google and found few articles
Slick 3.0.0 AutoIncrement Composite Key
Returning the auto incrementing value after an insert using slick
But somehow these do not answer the question cleanly.
To obtain the value immediately after an INSERT , use a SELECT query with the LAST_INSERT_ID() function. For example, using Connector/ODBC you would execute two separate statements, the INSERT statement and the SELECT query to obtain the auto-increment value.
It could have multiple causes: Check if the auto_increment value on the table itself, has the next highest value. Mind that if you have transactions where you INSERT a row and rollback the transaction, that auto_increment value will be gone/skipped.
Syntax for MySQLMySQL uses the AUTO_INCREMENT keyword to perform an auto-increment feature. By default, the starting value for AUTO_INCREMENT is 1, and it will increment by 1 for each new record. VALUES ('Lars','Monsen'); The SQL statement above would insert a new record into the "Persons" table.
Auto-increment allows a unique number to be generated automatically when a new record is inserted into a table. Often this is the primary key field that we would like to be created automatically every time a new record is inserted.
Here's the relevant documentation page, according to which, you should construct a query like this:
val insertQuery = items returning items.map(_.id) into ((item, id) => item.copy(id = id)) def create(name: String, price: Double) : Future[Item] = { val action = insertQuery += Item(0, name, price) db.run(action) }
Try this one instead:
def create(name: String, price: Double): Future[Int] = db.run { (items returning items.map(_.id)) += Item(0, name, price) }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With