Материалы

  1. ScalikeJDBC - библиотека для работы с реляционными БД в Scala
    1. Документация: http://scalikejdbc.org/
    2. Презентация: Scalikejdbc.pptx
  2. SCOPT - библиотека по разбору командной строки
    1. Документация: https://github.com/scopt/scopt
    2. Пример использования (из пакета org.mai.dep810.scala.iris в проекте )

      Объект с описанием структуры командной строки
      //Объект. в котором описана структура конфигурации командной строки
      case class Config (
                          commandLoad: String = "",
                          commandClear: String = "",
                          commandInit: String = "",
                          file: String = "",
                          append: Boolean = false,
                          dropTables: Boolean = false,
                          forse: Boolean = false
                        )
      Логика разбора командной строки
      // парсер определяет логику разбора командной строки
      val parser = new OptionParser[Config]("IrisLoader") {
      
        // название утилиты при распечатке
        head("IrisLoader", "1.0")
      
        //обрабатывает команду load и нужные команде аргументы --file и --append
        cmd("load")
          .action((_, c) => c.copy(commandLoad = "load")) //копируем команду в объект конфигурации
          .text("Load - это команда загрузки данных из файла") //описание команды
          .children(  // разбор сопутствующих аргументов
            opt[String]("file") // проверяем наличие аргумента --file. Должен иметь тип String
              .required() // аргумент обязателен
              .action((f, c) => c.copy(file = f)) // при наличии копируем в объект конфигурации
              .text("Путь к файлу с данными"), // описание аргумента
            opt[Unit]("append") // аргумент без значения (флаг) --append
              .abbr("a") // сокрщённая форма -a
              .action((f, c) => c.copy(append = true)) // при наличии копируем в объект конфигурации
              .text("Не удалять данные при загрозке. По умолчанию данные будут перезатираться") // описание аргумента
          )
        cmd("clean")
          .action((_, c) => c.copy(commandClear = "clean"))
          .text("Удалить данные из базы данных")
          .children(
            opt[Unit]("dropTables")
              .abbr("dt")
              .action((_, c) => c.copy(dropTables = true))
              .text("Удалить таблицы")
          )
        cmd("init")
          .action((_, c) => c.copy(commandInit = "init"))
          .text("Создать таблицы")
          .children(
            opt[Unit]("forse")
              .abbr("f")
              .action((_, c) => c.copy(forse = true))
              .text("Пересоздать таблицы, если существуют")
          )
      
        // дополнительные проверки целостности команд
        // в данном случае проверяем, что задана хотя бы одна команда
        checkConfig{c=>
          if(c.commandInit.isEmpty && c.commandLoad.isEmpty && c.commandClear.isEmpty) failure("Нужно указать хотя бы одну комманду") else success
        }
      }
      Использование
      // Разбор командной строки и реализация логики приложения в зависимости от командной строки 
      parser.parse(args,Config()) match {
        case Some(config) =>
      
          DBs.setup(irisDB)
      
          if(!config.commandClear.isEmpty) {
            if(config.dropTables) {
              dropTables
            } else {
              clearData
            }
          }
      
          if(!config.commandInit.isEmpty) {
            if(config.forse) {
              dropTables
            }
            createTables
          }
      
          if(!config.commandLoad.isEmpty) {
            if(!config.append) {
              clearData
            }
            loadIrisToDB(IrisParser.loadFromFile(config.file))
          }
      
          DBs.closeAll()
      
        case None => 
          // если командная строка не соответствует логике описанной в парсере
          // будет распечатана справка по использованию приложения
      }

Проект: lession12.zip

Задание

В трейте org.mai.dep810.scala.stackoverflow.DataLoader реализована выгрузка объектов  User, Post, Comment модели данных stackoverfow.

В классе org.mai.dep810.scala.stackoverflow.Main реализовать функционал сохранения и выгрузки объектов User, Post, Comment в\из БД,через командную строку. Описание структуры командной строки:

StackOverflowLoader 1.0
Usage: StackOverflowLoader [load|clean|init|extract]

Command: load [options]
Load - это команда загрузки данных из файлов
  --path <value>           Путь к папке с файлами
  -a, --append             Не удалять данные при загрузке. По умолчанию данные будут перезатираться
Command: clean [options]
Удалить данные из базы данных
  -dt, --dropTables        Удалить таблицы
Command: init [options]
Создать таблицы
  -f, --forse              Пересоздать таблицы, если существуют
Command: extract [options]
Выгрузить данные в csv формате
  -q, --query              Запрос на выбор данных
  --file                   Файл, куда выгрузятся данные

База данных сконфигурирована в файле src/main/resources/application.conf :

  so {
    driver = "org.h2.Driver"
    url = "jdbc:h2:file:./stackOverflowDB"
    user = "user"
    password = "pass"

    poolInitialSize = 5
    poolMaxSize = 7
    poolConnectionTimeoutMillis = 3000
    poolValidationQuery = "select 1 as one"
  }

Работа с конфигурациями подобного типа в scalikejdbc реализована с помощью библиотеки Config Typesafe - https://github.com/lightbend/config 


Для работы с БД предлагается использовать scalikejdbc.

Для разбора командной строки предлагается использовать библиотеку scopt.


Частично реализованное задание: lession12_with_users.zip

  • No labels