Мне нужно вставить последовательность элементов с последовательностью вложенных элементов в базу данных PostgreSQL, предпочтительно с помощью одного оператора, потому что я возвращаю Future
. Я использую Scala Play с Anorm.
Мои данные выглядят примерно так, как показано ниже.
case class Question(id: Long, titel: String)
case class Answer(questionId: Long, text: String)
В БД это выглядит так:
CREATE TABLE questions (
question_id SERIAL PRIMARY KEY NOT NULL,
titel TEXT NOT NULL,
);
CREATE TABLE answers (
answer_id SERIAL PRIMARY KEY NOT NULL,
question_id INT NOT NULL,
text TEXT NOT NULL,
FOREIGN KEY (question_id) REFERENCES questions(question_id) ON DELETE CASCADE
);
Моя функция будет выглядеть примерно так:
def saveFormQuestions(questions: Seq[Question], answers: Seq[Answer]): Future[Long] = {
Future {
db.withConnection{ implicit c =>
SQL(
// sql
).executeInsert()
}
}
}
Каким-то образом в Anorm, SQL или в обоих я должен сделать следующее, желательно в одной транзакции:
- foreach question in questions
- insert question into questions
- foreach answer in answers, where answer.questionId == old question.id
- insert answer into answers with new question id gained from question insert
Я новичок в Scala Play, поэтому, возможно, сделал некоторые предположения, которые не должен был делать. Любые идеи, которые помогут мне начать, будут оценены.
println
с соответствующим ожидаемым оператором. - person cchantep   schedule 28.08.2017