« 2009年10月 | トップページ | 2010年1月 »

2009年11月

2009年11月14日 (土)

MySQLのテーブル一覧、create table一覧、show index一覧、レコード数の一覧を取得する。

MySQLにおいて、指定したデータベースにあるすべてのテーブルのcreate tableの一覧や、
index情報の一覧やレコード数の一覧を作成するコマンドをrubyで作った。
rubyのmysqlのパッケージに依存するため、予め、下記のコマンドを実行してインストールしておく
必要がある。
sudo gem install mysql


使い方

table_info.rb -d データベース名 [-H ホスト名] [-P ポート番号] [-u ユーザー名][-p パスワード][-c][-i][-n]

-d データベース名 必須。
-H ホスト名 指定しなかった場合はlocalhost
-P ポート番号 指定しなかった場合は3306
-u ユーザー名 指定しなかった場合はroot 
-p パスワード 指定しなかった場合はなし。
-c create tableの一覧を出力
-i show indexの一覧を出力
-n レコード数の一覧を出力

-c,-i,-nは同時指定可能です。

#!/usr/bin/ruby
require 'rubygems'
require 'mysql'
require 'optparse'
options = {
  :database => '',
  :host=> 'localhost',
  :create=> false,
  :count=> false,
  :index=> false,
  :port=> 3306,
  :user=> 'root',
  :password => '',
}
begin
  parser = OptionParser.new do |opt|
    opt.banner = "Usage: #{File.basename($0)} [Option]"
    opt.on("-d","--database String","database name") { |o|
      options[:database] = o
    }
    opt.on("-H","--hostname String","hostname. default: localhost") {|o|
      options[:host] = o
    }
    opt.on("-n","--number","count record number. caution! don't use ovarload") {
      options[:count] = true
    }
    opt.on("-c","--create","show create table list.") {
      options[:create] = true
    }
    opt.on("-i","--index","show index from table list.") {
      options[:index] = true
    }
    opt.on("-P","--port Integer","port. default: 3306.") {|o|
      options[:port] = o
    }
    opt.on("-u","--user String","user name. default:root"){|o|
      options[:user] = o
    }
    opt.on("-p","--password String","password. default:''"){|o|
      options[:password] = o
    }
    opt.on("-h","--help","print this message and quit") {
      puts opt.help
      exit 0
    }
    opt.parse!(ARGV)
  end
rescue OptionParser::ParseError => err
  $stderr.puts(err.message)
  exit 1
end
if options[:database] == nil or options[:database] == ""
  $stderr.puts("no database name.")
  exit 1
end
my = Mysql.init()
#接続開始
db = Mysql::new(options[:host], options[:user], options[:password],options[:database],options[:port])
#SQL文の実行
st = db.query("show tables")
st.each do |tbl|
  puts "TABLE=#{tbl[0]}"
  if options[:create]
    st2 = db.query("show create table #{tbl[0]}")
    st2.each do |attr|
      printf "%s\n"%attr[1]
    end
  end
  if options[:index]
    st3 = db.query("show index from #{tbl[0]}")
    key_name = {}
    st3.each do |idx|
      unless key_name[idx[2]]
        key_name[idx[2]] = {} 
        key_name[idx[2]]["Cardinality"] = idx[6]
        if idx[1] == 1
          key_name[idx[2]]["Non_unique"] = "True"
        else
          key_name[idx[2]]["Non_unique"] = "False"
        end
        key_name[idx[2]]["Index_type"] = idx[10]
        key_name[idx[2]]["Column_name"] = []
      end
      key_name[idx[2]]["Column_name"].push idx[4]
    end
    next if key_name.size == 0
    key_data = []
    key_name.each do |key,val|
      if key == "PRIMARY"
        val["Key_name"] = key
        key_data.unshift val
      else
        val["Key_name"] = key
        key_data.push val
      end
    end
    key_data.each do |data|
      puts "key_name=>#{data['Key_name']}  Non_unique=>#{data['Non_unique']} "+
        "Cardinality=>#{data['Cardinality']} "+
        "Index_type=>#{data['Index_type']}  Column_name=>#{data['Column_name'].join(',')}"
    end
  end
  if options[:count]
    st4 = db.query("select count(*) from #{tbl[0]}")
    st4.each do |attr|
      printf "total count=%d\n"%attr[0]
    end
  end
  printf "\n\n"
end
#接続を切断する
db.close

| | コメント (0) | トラックバック (0)

エクセルでシートごとへのリンクの一覧を作成する。

データベースの各テーブルの説明がエクセルのシートごとに記述されていたが、
希望のテーブルのシートを探すのにすごく手間取る。
そこで、先頭にシート一覧というシートを作成し、そのシートに各シートへのリンクした一覧をつける
マクロを作成した。
ただ、めっちゃ遅い。40枚ぐらいシートがあると、4~5分応答が返ってこない。

Sub sheet_list()
    Dim find As Boolean
    Dim cnt As Integer
    
    find = SearchSheet("リンク一覧")
    If find = False Then
        Set objWks = ActiveWorkbook.Worksheets.Add(before:=Worksheets(1))
        objWks.name = "リンク一覧"
    End If
    ActiveWorkbook.Worksheets("リンク一覧").Select
    cnt = 1
    Columns("A").ColumnWidth = 40
    For Each i In ActiveWorkbook.sheets
        If i.name <> "リンク一覧" Then
            Rows(cnt).RowHeight = 40
            ActiveSheet.Hyperlinks.Add Anchor:=Cells(cnt, 1), Address:="", _
                SubAddress:="'" & i.name & "'" & "!A1", TextToDisplay:=i.name
            Cells(cnt, 1).Font.Size = 16
            cnt = cnt + 1
        End If
    Next i
End Sub
Function SearchSheet(name As String) As Boolean
    'シート数取得
    Dim intIdx As Integer
    Dim intWksCnt As Integer
    
    intIdx = 1
    intWksCnt = Excel.ActiveWorkbook.Worksheets.Count
    Do While intIdx <= intWksCnt
        If Worksheets(intIdx).name = name Then
            SearchSheet = True
            Exit Function
        End If
        intIdx = intIdx + 1
    Loop
    SearchSheet = False
End Function

| | コメント (0) | トラックバック (0)

« 2009年10月 | トップページ | 2010年1月 »