I have a Play/Slick application where I need to run several plain sql queries multiple times (n) in a single transaction.
Here is the code for one iteration, i.e. when n = 1:
val query1 = sql"""insert into some_table_1 (date) values (NOW())""".asUpdate
val query2 = sql"""insert into some_table_2 (date) values (NOW())""".asUpdate
val query3 = sql"""insert into some_table_3 (date) values (NOW())""".asUpdate
val composedAction = for {
result1 <- query1
result2 <- query2
result3 <- query3
} yield result3
val result = db.run(composedAction.transactionally)
Now, I actually want to change the above composedAction so that it would iterate over the 3 queries n = 1,000 times in one transaction (i.e. I want the 3 * 1,000 = 3,000 queries to either all fail or all succeed).
How can I do that?
Update:
The reason I want to keep the for structure is that result1 is the input of query2, result2 is the input of query3.
Something like this (it doesn't compile):
def query1(number: Int) = sql"""insert into some_table_1 (number) values ($number)""".asUpdate
def query2(number: Int) = sql"""insert into some_table_2 (number) values ($number)""".asUpdate
def query3(number: Int) = sql"""insert into some_table_3 (number) values ($number)""".asUpdate
val composedAction = for {
i <- (1 to 1000)
result1 <- query1(i)
result2 <- query2(result1)
result3 <- query3(result2)
} yield result3 //this is the 1000th result3