スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

開発中にDBに一括で登録するスクリプト

開発中には、以下ような感じでSQLファイル等を分けて管理しています。

db
|- bin
|- erd
|- sql
|- 01schema.sql
|- 02data.sql
|- lib
|- uv_plpgsql.sql
|- ...
|- stored
|- ...
|- table
|- users.sql
|- ...

これを一括でDBに登録するのがめんどくさいです。
なのでスクリプト書きました。
vi bin/config.yaml

default: &default
psql: /usr/bin/psql
base: ../sql
db_host: localhost
db_user: user
db_name: web_development
params:
- name: schema
path: 01schema.sql
command: c
- name: lib
path: lib/*.sql
command: l
- name: table
path: table/*.sql
command: t
- name: stored
path: stored/*.sql
command: s
- name: data
path: 02data.sql
command: d

development:
<<: *default

test:
<<: *default
db_name: web_test


vi bin/make_sql.rb

require 'optparse'
require 'tempfile'
require "yaml"
require "erb"

# ファイルを読み込む
def read_one(path, dst)
open(path) do |file|
dst.puts file.read
end
end

# ディレクトリの中のファイルを読み込む
def read_many(path, dst)
Dir::glob(path).each do |f|
read_one(f, dst)
end
end

# パラメーターをパースする
def parse(params)
ary = []
all = []
params.each do |param|
all << param["command"]
ary << "-#{param["command"]} : #{param["name"]}"
end
ary << "-e : 環境名"
ary << "-#{all.join("")} : all"
[ary.join("\n"), all.join("") + "e:"]
end

# コマンドを生成する
def make_command(environment, file)
"#{environment["psql"]} -h #{environment["db_host"]} -U #{environment["db_user"]} #{environment["db_name"]} < #{file.path}"
end

#
# 処理本体
#

# コンフィグを読み込む
config = open("./config.yaml") do |f|
::YAML::load(::ERB.new(f.read).result)
end

# エラーメッセージと全てのパラメーター取得
error_message, all_parameters = parse(config["development"]["params"])

# 引数が空の時は終了
if ARGV.empty?
puts error_message
exit 0
end
params = ARGV.getopts(all_parameters)

# 環境が無い場合は終了
if params["e"].nil? || "" == params["e"]
puts error_message
exit 0
end

environment = config[params["e"]]
base = environment["base"]

Tempfile.open('makesql') do |file|
targets = environment["params"]
targets.each do |target|
# コマンドが選択されているものだけ処理する
if params[target["command"]]
path = "#{environment["base"]}/#{target["path"]}"
if /\*/ =~ target["path"]
read_many(path, file)
else
read_one(path, file)
end
end
end
file.close
command = make_command(environment, file)
system(command)
end


以下のように実行します。
ruby make_sql.rb -cltsd -e development
スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。