Size: a a a

Scala User Group

2021 February 28

Α

Αγβεκ in Scala User Group
Aλexander Semenov
Частично согласен, но db.run вызывать самому необязательно. Это всё в прослойке (тонкой).
есть ссылки где можно глянуть как это сделать?
Я щас обычно фигачу везде deferFromFuture - не оч красиво
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
Αγβεκ
есть ссылки где можно глянуть как это сделать?
Я щас обычно фигачу везде deferFromFuture - не оч красиво
написать обертку для слика, нет?
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
def runSlickStuff(slickStuff: DBIO…): Task[…]
источник

AS

Aλexander Semenov in Scala User Group
val transact = new (DBIO ~> F) {
 override def apply[A](dbio: DBIO[A]): F[A] = {
   import schema.databaseProfile.api._

   deferFuture(_ => db.run(dbio.transactionally))
 }
}
источник

Α

Αγβεκ in Scala User Group
Aλexander Semenov
val transact = new (DBIO ~> F) {
 override def apply[A](dbio: DBIO[A]): F[A] = {
   import schema.databaseProfile.api._

   deferFuture(_ => db.run(dbio.transactionally))
 }
}
источник

AS

Aλexander Semenov in Scala User Group
Αγβεκ
есть ссылки где можно глянуть как это сделать?
Я щас обычно фигачу везде deferFromFuture - не оч красиво
Ты можешь вообще не писать нигде db.run. Например, можно репозитории автоматически переводить из DBIO в твой F. Например, если есть какой-то Repo
trait UserRepo[F[_]] {
 def findUserByEmail(email: Email): F[Option[User]]
}
class UserRepoImpl(...) extends UserRepo[DBIO] {
 // ...
}

То, имея ~> выше, можно с помощью cats-tagless превратить твой UserRepo[DBIO] в UserRepo[F].
implicit val functorKUserRepo: FunctorK[UserRepo] = Derive.functorK[UserRepo]
userRepoImpl.mapK(transact)

И транзакции будут выполнять автоматически при покидании DB слоя.
источник

Α

Αγβεκ in Scala User Group
Aλexander Semenov
val transact = new (DBIO ~> F) {
 override def apply[A](dbio: DBIO[A]): F[A] = {
   import schema.databaseProfile.api._

   deferFuture(_ => db.run(dbio.transactionally))
 }
}
можно еще синтаксис написать и будет дуби

резюмируя можно сказать что slick > doobie по фукнционалу
все что есть в дуби даёт + дает высокоуровневый dsl
чтобы не фигначить руками insert-ы в огромные таблицы
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Aλexander Semenov
val transact = new (DBIO ~> F) {
 override def apply[A](dbio: DBIO[A]): F[A] = {
   import schema.databaseProfile.api._

   deferFuture(_ => db.run(dbio.transactionally))
 }
}
сложный код
источник

AS

Aλexander Semenov in Scala User Group
Oleg ℕizhnik
сложный код
Олег посоветовал 🤷‍♂️
источник

Oℕ

Oleg ℕizhnik in Scala User Group
можно заюзать tofu.syntax.functionK.funk
источник

Oℕ

Oleg ℕizhnik in Scala User Group
там будет
val transact : DBIO ~> F =
  funk(dbio => deferFuture( _ => db.run(dbio.transactionally)))
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
Αγβεκ
можно еще синтаксис написать и будет дуби

резюмируя можно сказать что slick > doobie по фукнционалу
все что есть в дуби даёт + дает высокоуровневый dsl
чтобы не фигначить руками insert-ы в огромные таблицы
тут еще подумать надо, когда этот весь функционал стоит того
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
если у тебя микросервис с тремя запросами, то дуби выигрывает за счет простоты — добавил зависимости и поехал
источник

Α

Αγβεκ in Scala User Group
Λнтон Войцишевский
тут еще подумать надо, когда этот весь функционал стоит того
например есть таблица из 100 колонок в слике написал в даошке
table += value и все обновляешь кейс класс свой
в дуби придется поправить запрос, который уже состоит из 100 строк
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
в каком проценте сервисов реально есть таблицы в 100 колонок?
источник

AS

Aλexander Semenov in Scala User Group
Oleg ℕizhnik
там будет
val transact : DBIO ~> F =
  funk(dbio => deferFuture( _ => db.run(dbio.transactionally)))
val transact: DBIO ~> F =
 funK(dbio => deferFuture( _ => postgresDatabase.run(dbio.transactionally)))

value transactionally is not a member of slick.dbio.DBIO[stabilizer$1.Arbitrary]
       funK(dbio => deferFuture( _ => postgresDatabase.run(dbio.transactionally)))


Не компилится что-то
источник

Α

Αγβεκ in Scala User Group
Oleg ℕizhnik
там будет
val transact : DBIO ~> F =
  funk(dbio => deferFuture( _ => db.run(dbio.transactionally)))
источник

AS

Aλexander Semenov in Scala User Group
Aλexander Semenov
val transact: DBIO ~> F =
 funK(dbio => deferFuture( _ => postgresDatabase.run(dbio.transactionally)))

value transactionally is not a member of slick.dbio.DBIO[stabilizer$1.Arbitrary]
       funK(dbio => deferFuture( _ => postgresDatabase.run(dbio.transactionally)))


Не компилится что-то
My fault, import postgresSchema.databaseProfile.api._ потерялся. Да, так короче 🙏
источник

Α

Αγβεκ in Scala User Group
Λнтон Войцишевский
если у тебя микросервис с тремя запросами, то дуби выигрывает за счет простоты — добавил зависимости и поехал
да и в слике добавил зависимости и поехал - ничего такого там нет
если запросы простые даже sql ки не надо будет писать
dsl справится
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
Αγβεκ
да и в слике добавил зависимости и поехал - ничего такого там нет
если запросы простые даже sql ки не надо будет писать
dsl справится
дак ты ж выше сам писал, что надо все врапить в деферФутуре, вот это и есть доп пляски
источник