commit 66bb8d9d3921e5e390a392aa555584e1c09cb586 Author: Jonathan Bernard Date: Sun Jan 31 00:18:21 2016 -0600 Initial commit: create verb only. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6f5a8ef --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +nimcache/ +*.sw? +build/ +db_migrate diff --git a/README.md b/README.md new file mode 100644 index 0000000..dabef96 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +Nim DB Migrate +============== + +Small tool to manage database migrations in Nim. diff --git a/db_migrate.nim b/db_migrate.nim new file mode 100644 index 0000000..509de49 --- /dev/null +++ b/db_migrate.nim @@ -0,0 +1,73 @@ +## DB Migrate +## ========== +## +## Simple tool to manage database migrations. + +import json, times, os, docopt + +type DbMigrateConfig* = tuple[ driver, sqlDir, connectionString: string ] + +proc loadConfig*(filename: string): DbMigrateConfig = + let cfg = json.parseFile(filename) + let config = ( + driver: if cfg.hasKey("driver"): cfg["driver"].getStr else: "postres", + sqlDir: if cfg.hasKey("sqlDir"): cfg["sqlDir"].getStr else: "migrations", + connectionString: cfg["connectionString"].getStr) + + # Check for migrations directory + # TODO: try/except + if not existsDir config.sqlDir: + echo "SQL directory '" & config.sqlDir & + "' does not exist and will be created." + createDir config.sqlDir + + return config + +proc createMigration*(config: DBMigrateConfig, migrationName: string): seq[string] = + let timestamp = getTime().getLocalTime().format("yyyyMMddHHmmss") + let filenamePrefix = timestamp & "-" & migrationName + + let upFilename = joinPath(config.sqlDir, filenamePrefix & "-up.sql") + let downFilename = joinPath(config.sqlDir, filenamePrefix & "-down.sql") + + let scriptDesc = migrationName & " (" & timestamp & ")" + + # TODO: try/except and catch errors creating files. + let upFile = open(upFilename, fmWrite) + let downFile = open(downFilename, fmWrite) + + upFile.writeLine "-- UP script for " & scriptDesc + downFile.writeLine "-- DOWN script for " & scriptDesc + + upFile.close() + downFile.close() + + return @[upFilename, downFilename] + +when isMainModule: + let doc = """ +Usage: + db-migrate [options] create + +Options: + -c --config Use the given configuration file (defaults to + "database.json"). +""" + + # Parse arguments + let args = docopt(doc, version = "db-migrate 0.1.0") + + echo $args + + # Load configuration file + let configFilename = + if args["--config"]: $args["--config"] + else: "database.json" + + let config = loadConfig(configFilename) + + # Execute commands + if args["create"]: + let filesCreated = createMigration(config, $args[""]) + echo "Created new migration files:" + for filename in filesCreated: echo "\t" & filename diff --git a/db_migrate.nimble b/db_migrate.nimble new file mode 100644 index 0000000..3c808e7 --- /dev/null +++ b/db_migrate.nimble @@ -0,0 +1,12 @@ +# Package + +bin = @["db_migrate"] +version = "0.1.0" +author = "Jonathan Bernard" +description = "Simple tool to handle database migrations." +license = "BSD" + +# Dependencies + +requires: @["nim >= 0.13.0", "docopt >= 0.1.0"] +