Curso de Scala básico

Curso de Scala básico

Carlos Daniel Sanchez

Carlos Daniel Sanchez

Configuración de Slick

28/36

Lectura

Antes de empezar, deberías descargar el template Play Scala Seed desde esta página: https://developer.lightbend.com/start/?group=play&project=play-scala-seed

...

Regístrate o inicia sesión para leer el resto del contenido.

Aportes 17

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

No me gusto este articulo, pudo haber sido explicado un poco mejor con videos porque algunos pasos se prestan a confusion y por lo menos en el articulo en vez de dejar imagenes, hubiera estado mejor dejar snippets para copiar y pegar porque muchas de estas cosas son demasiado boilerplate y esta muy facil equivocarse por un par de caracteres

Me parece pésima esta clase, qué pasó íbamos bien, muy diferente ver codificar y entender cada elemento que leer un documento.

Hay una serie de errores en el codigo mostrado, puede ser por la nueva versión de play, recomiendo se realicen las correcciones necesarias, dado que se invierte mucho tiempo en tratar de ejecutar el ejercicio, me tomo el atrevimiento de compartir este repositorio de Jonathan Valencia que me ayudo con la configuración de la base de datos con slick https://github.com/jonathanvalenciav/platzi-video.

Ay que bien se siente jajaja al fin, después de la infinidad de errores

Funciono! Después de tantos errores

Creo que también es importante lo siguiente:

  • mencionar la versión de sbt, porque me salían errores con ello. Al final usé el sbt que me sugería IntelliJ y reinicié el IDE y ahí funcionó.
  • También es importante que si nos saltamos aprender Play Framework al menos nos expliquen que con código, no tanto con imágenes. Bueno, o al menos indicar que el IDE coloca cierto texto encima. Soy nuevo en IntelliJ y copié todo el texto manualmente como se muestra :
    entonces, perdí mucho tiempo colocando texto que coloca el IDE mismo. Creo que sería bueno que editaran ésta clase con un taller o video explicativo de cómo resolver los montón errores que nos salieron.

Gracias Jonathan Valencia y Martín Albarracín.

Para los que tienen problemas corriendo el proyecto les dejo mi repositorio, para guía , hay algunas cositas que no están explicitas en el articulo y hay que leer un poco más sobre todo de el framework para que funcione para los que tengan experiencia en spring les sera un poco mas sencillo entender.

Mi principal problema fue identificar correctamente los imports que hay que hacer así como implementar el controller lo necesario para la compilación.

https://github.com/djaquels/PlayMovies

Obtengo errores en todo 😑

Imágenes:


El error en navegador:

IO error while decoding C:\Users\sistemasfimtt\iCloudDrive\Platzi\Carreras\Fundamentos de Programación\ProgramacionFuncionalConScala\play-scala-seed\target\scala-2.13\routes\main\controllers\ReverseRoutes.scala with UTF-8: MALFORMED[1]
Please try specifying another one using the -encoding option

Mis archivos:
build.sbt

name := """platzi-video"""
organization := "com.platzi"

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.13.1"

libraryDependencies += guice
libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "5.0.0" % Test
libraryDependencies += "com.typesafe.play" %% "play-slick" % "4.0.2"
libraryDependencies += "org.xerial" % "sqlite-jdbc" % "3.28.0"

application.conf

# https://www.playframework.com/documentation/latest/Configuration

slick.dbs.default.profile="slick.jdbc.SQLiteProfiles$"
slick.dbs.default.db.driver="org.sqlite.JDBC"
slick.dbs.default.db.url="jdbc:sqlite:MyDataBase.db"
slick.dbs.default.db.user=""
slick.dbs.default.db.password=""

slick.default="model.*"

Movie.scala

package models
import java.util.UUID

/*
  Objeto Movie.
 */
case class Movie(
  id: Option[String] = Option(UUID.randomUUID.toString),
  title: String,
  year: Int,
  cover: String,
  description: String,
  duration: Int,
  contentRating: String,
  source: String,
  tags: Option[String]
)

MovieTable.scala

package models
import slick.jdbc.SQLiteProfile.api_
/*
  Clase que mapea el objeto a la tabla movie.

  https://scala-slick.org/doc/3.3.1/schemas.html
 */
class MovieTable(tag: Tag) extends Table[Movie](tag, _tableName = "movie"){
  def id: Rep[String] = column[String]("id", 0.PrimaryKey)
  def title: Rep[String] = column[String]("title")
  def year: Rep[Int] = column[Int]("year")
  def cover: Rep[String] = column[String]("cover")
  def description: Rep[String] = column[String]("description")
  def duration: Rep[Int] = column[Int]("duration")
  def contentRating: Rep[String] = column[String]("content_rating")
  def source: Rep[String] = column[String]("source")
  def tags: Rep[Option[String]] = column[Option[String]]("tags", 0.Lenght(2000, varying = true))

  def *: ProvenShape[Movie] = (id.?, title, year, cover, duration, contentRating, source, tags) <> (Movie.tupled, Movie.unapply)
}

MovieRepository.scala

package models
import javax.inject.Inject
import play.api.db.slick.{DatabaseConfigProvider, HasDatabaseConfigProvider}
import play.api.mvc.{AbstractController, ControllerComponents}
import scala.concurrent.{ExecutionContext, Future}
/*
  Clase repository, donde irán las consultas.
 */
class MovieRepository @Inject()(
  protected val dbConfigProvider: DatabaseConfigProvider, cc: ControllerComponents
)(implicit ec: ExecutionContext)
  extends AbstractController(cc)
  with HasDatabaseConfigProvider[JdbcProfile]{
  private lazy val movieQuery = TableQuery[MovieTable]
}
/*
  * Función de ayuda para crear la tabla si esta
  * aún no existe en la base de datos.
  * @return
 */
def dbInit: Future[Unit] = {
  // Definición de la sentencia SQL de creación del schema
  val createSchema = movieQuery.schema.createIfNotExists
  // db.run ejecuta una secuencia SQL, devolviendo un Future
  db.run(createSchema)
}

def getAll = ???
def getOne = ???
def create = ???
def update = ???
def delete = ???

HomeController.scala

package controllers

import javax.inject._
import play.api._
import play.api.mvc._
// Importar el repository y el contexto de ejecución global
import models.MovieRepository
import scala.concurrent.ExecutionContext.Implicits.global

/**
 Hay quea gregar el repository para que sea inyectado
 */
@Singleton
class HomeController @Inject()(
  cc: ControllerComponents,
  movieRepository: MovieRepository
) extends AbstractController(cc){
  // ...
  /*
    Función de ayuda para crear la tabla si esta aún no existe
   */
  def dbInit() = Action.async{ request =>
    movieRepository.dbInit
      .map(_ => Created("Tabla creada"))
      .recover{ex =>
        play.Logger.of("dbInit").debug("Error en dbInit", ex)
        InternalServerError(s"Hubo un error")
      }
  }
}

routes

# Routes
# This file defines all application routes (Higher priority routes first)
# https://www.playframework.com/documentation/latest/ScalaRouting
# ~~~~

# An example controller showing a sample home page
GET     /                           controllers.HomeController.index

# Map static resources from the /public folder to the /assets URL path
GET     /assets/*file               controllers.Assets.versioned(path="/public", file: Asset)

GET     /dbInit                     controllers.HomeController.dbInit

¿Algún apoyo con el tema?

este es la estructura de archivos y como debe quedar.
tuve que importar muchas cosas por defecto según me indicaba IntelliJ porque en el post creo que hay muchos pasos que no se menciona. estar[e subiendo el código a Github

Código de las dependencias al momento de creación de este comentario: `libraryDependencies ``+= "com.typesafe.play" %% "play-slick" % "5.3.0"` `libraryDependencies ``+= "org.xerial" % "sqlite-jdbc" % "3.46.0.0"`

Che clase toda qlera, en fin
Para aquellos que no les instale las dependencias y estén usando Intellij. Cierren y abran de nuevo su proyecto.
Posterior a eso también tomen de guía a quienes ya les quedo el proyecto y lo comentaron como aporte en esta sección

Se pudo a la primera. Si usan VS Code les da ayudas sobre si algo no es correcto, habiendo instalado las extenciones que se recomiendan en una de las primeras clases del curso.

Por fin funciono de cientos de intentos

Dejo mi repo si necesitan alguna guia.

Esta clase te arruina el curso, al ser todo imagenes y no poder copiar es un desastre no te queda igual, no compila, lo hace engorroso, una lastima

Terrible artículo. Una explicación bastante insuficiente y pobre

para las personas que recién lleguen como yo y no quieran ponerse a transcribir imagen por imagen tengo este hackLife:
descarguen cada imagen recortenla y carguenla aquí, es un OCR para pasar de imagen a texto https://www.onlineocr.net/es/

Buenas, alguien por favor que me hace falta. Cuando lanzo el comando sbt update muestra el siguiente error:

download error: Caught javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building fail
ed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target (sun.security.validator.ValidatorExceptio
n: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target) while download
ing https://repo.typesafe.com

He buscado pero no se que me falta.
tengo jdk1.8.0_281 de 64 bits y javac 1.8.0_281
Mi build.sbt es

name := "mi-primer-scala"
organization := "com.scala"

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.13.3"

libraryDependencies += guice
libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "5.0.0" % Test
libraryDependencies += "com.typesafe.play" %% "play-slick" % "4.0.2"
libraryDependencies += "org.xerial" %% "sqlite-jdbc" % "3.28.0"

// Adds additional packages into Twirl
//TwirlKeys.templateImports += "com.example.controllers._"

// Adds additional packages into conf/routes
// play.sbt.routes.RoutesKeys.routesImport += "com.example.binders._"```

Nota: tengo el cacerts en la ruta: C:\Program Files (x86)\Java\jre1.8.0_281\lib\security pero entonces no entiendo que me hace falta. Gracias