Материалы
- ScalikeJDBC - библиотека для работы с реляционными БД в Scala
- Документация: http://scalikejdbc.org/
- Презентация: Scalikejdbc.pptx
- SCOPT - библиотека по разбору командной строки
- Документация: https://github.com/scopt/scopt
Пример использования (из пакета org.mai.dep810.scala.iris в проекте )
Блок кода language java title Объект с описанием структуры командной строки collapse true //Объект. в котором описана структура конфигурации командной строки case class Config ( commandLoad: String = "", commandClear: String = "", commandInit: String = "", file: String = "", append: Boolean = false, dropTables: Boolean = false, forse: Boolean = false )
Блок кода language java title Логика разбора командной строки collapse true // парсер определяет логику разбора командной строки 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 } }
Блок кода language java title Использование collapse true // Разбор командной строки и реализация логики приложения в зависимости от командной строки 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.dep110.scala.stackoverflow.DataLoader реализована выгрузка объектов User, Post, Comment модели данных stackoverfow.
В классе org.mai.dep110.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