Сохранение списков с использованием платформы Play и Anorm

В настоящее время я разрабатываю небольшое приложение на Scala с использованием платформы Play, и я хотел бы сохранить список операций, выполненных пользователем. Можно ли хранить простой список идентификаторов (List[Long]), используя только Anorm, как это делаю я?

В противном случае, что еще я мог бы использовать, чтобы заставить его работать? Нужно ли мне использовать ORM, как описано в Scala Play! Используете анорма или ORM?


person user1194311    schedule 19.03.2013    source источник


Ответы (3)


Если вы говорите о сохранении в базе данных SQL, то Anorm, безусловно, может справиться с этим за вас.

На самом базовом уровне вы можете создать таблицу длинных целых чисел в своей базе данных SQL, а затем использовать Anorm для сохранения списка. Предположим, что вы храните свои целые числа в таблице с одним столбцом, называемой UserActions, с единственным столбцом, называемым action:

def saveList(list: List[Long]) = {
  DB.withConnection { implicit connection =>
    val insertQuery = SQL("insert into UserActions(action) values ({action})")
    val batchInsert = (insertQuery.asBatch /: list)(
      (sql, elem) => sql.addBatchParams(elem)
    )
    batchInsert.execute()
  }
}

Я собрал для вас небольшую демонстрацию и отправляю ее в Heroku, я скоро обновлю ссылку (редактировать: Heroku и я сегодня не ладим, извините).

Код находится в моем Github по адресу: https://github.com/ryantanner/anorm-batch-demo

Посмотрите в models/UserActions.scala, чтобы найти именно этот фрагмент. Остальное просто чепуха, чтобы сделать демо более интересным.

Теперь я бы сделал шаг назад и спросил себя, какая информация вам нужна об этих пользовательских операциях. Что семантически означает этот List[Long] значит? Вам нужно хранить больше информации об этих действиях пользователя? Должно ли это быть что-то вроде строк (UserID, PageVisited, Timestamp)?

person Ryan    schedule 19.03.2013
comment
Я объясню немного больше. У меня есть объект User (с пользователем таблицы для его сохранения), и я хотел бы представить объект Order, который будет представлять заказ, сделанный пользователем. Заказ может состоять из одного или нескольких Товаров (-> список?), и Пользователь может иметь более одного Заказа (-> список?). Теперь, чтобы сохранить это, я планировал хранить список идентификаторов заказов (List[Long]) в таблице user и список идентификаторов элементов (List[Long]) в таблице order. Если только у вас нет идеи получше... - person user1194311; 21.03.2013

Не проверено

Я думаю, вам нужно создать оператор пакетной вставки следующим образом:

  val insertStatement = 
    SQL("""INSERT INTO UserOperations (id) VALUES ({id})""")
   .asBatch
   .addBatchParamsList(List(Seq(1),  Seq(2)))
   .execute()
person EECOLOR    schedule 19.03.2013
comment
это работает, но можете ли вы предоставить мне добавить динамический список o0f Sequence ?? - person Rishi Dwivedi; 14.04.2014
comment
Пожалуйста, создайте новый вопрос stackoverflow с подробностями вашей проблемы и некоторым кодом. - person EECOLOR; 14.04.2014

BatchSql из Anorm был недавно обновлен. Вы можете проверить последние.

person cchantep    schedule 09.07.2014