Материалы
- ScalikeJDBC - библиотека для работы с реляционными БД в Scala
- Документация: http://scalikejdbc.org/
- Презентация: Scalikejdbc.pptx
- SCOPT - библиотека по разбору командной строки
- Документация: https://github.com/scopt/scopt
Пример использования (из пакета 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