SQLite3をターミナルから操作すればテーブル名やカラム名は取得できます。
SQL文も調べればすぐ出てきますから、覚えるかメモしておけば問題はないでしょう。
ただ、もう少しお手軽にdbの中身を知りたいと思い、rubyで組んでおきます。
そうすることで、SQL文を忘れてもファイルの移動と実行だけなので楽になるかなと思いまして。
準備(rubyでSQLite3を扱う)
rubyでsqlite3を操作するためにデータベースオブジェクトを取得します。
db = SQLite3::Database.new('ファイル名.db')
このオブジェクトに対して .execute(sql) で操作します。
db.execute(xxxxxx)
xxxxxxのところにSQL文が入ります。
テーブル名の取得
SQLでは下記の文でテーブルについての情報を取得することができます。
SELECT * FROM sqlite_master
rubyでは下記のようになります。
tbls_info = db.execute('SELECT * FROM sqlite_master')
tbls_infoには配列が入ります。
配列の中には、さらに配列が入っています。配列の中に配列がある形ですね。
下記の5つの情報が入った配列が、テーブルの数だけ配列としてまとめられています。
- type
- name
- tbl_name
- rootpage
- sql
今回はテーブル名を取得しますので、2番目の要素を抜き出します。
tbls_info.each do |tbl|
p tbl[1]
end
まとめると
require 'sqlite3'
db = SQLite3::Database.new('ファイル名.db')
tbls_info = db.execute('SELECT * FROM sqlite_master')
tbls_info.each do |tbl|
p tbl[1]
end
db.close
カラム名を取得する
SQLでは下記の文でカラムについての情報を取得することができます。
PRAGMA table_info('テーブル名')
rubyではdb.execute(xxxxxx)を使います。
cols_info = db.execute('PRAGMA table_info(テーブル名)')
カラムの情報も配列の配列で返ってきます。
- cid
- name
- type
- notnull
- dflt_value
- pk
2番目の要素にカラム名が入っているのでそれを出力します。
また、この処理にはテーブル名が必要なので、上記で取得したテーブル名を使います。
require 'sqlite3'
db = SQLite3::Database.new('ファイル名.db')
tbls_info = db.execute('SELECT * FROM sqlite_master')
tbls_info.each do |tbl|
p tbl[1]
cols_info = db.execute("PRAGMA table_info(#{tbl[1]})")
cols_info.each do |col|
p col[1]
end
end
db.close
ファイル名の取得も含める
ファイル名を取得して、テーブル名とカラム名を表示します。
require 'sqlite3'
def get_name_table(db)
db.execute('SELECT * FROM sqlite_master').map{|e| e[1]}
end
def get_name_column(db, tbl_name)
db.execute("PRAGMA table_info(#{tbl_name})").map{|e| e[1]}
end
Dir.glob('*.db').each do |fn|
SQLite3::Database.new(fn) do |db|
puts "[#{fn}]"
get_name_table(db).each do |tbl_name|
ar = get_name_column(db, tbl_name)
puts " #{tbl_name} (#{ar.join(' + ')})"
end
puts '-' * 36
end
end
上記のファイルを実行すれば、同じディレクトリにある拡張子が.dbのファイルについて、テーブル名とカラム名をSTDOUTで表示します。
終わり
rubyもdbも勉強中です。
間違いがありましたらご指摘をお願いします。
また、全体的に拙いものですし、こうした方がいいよ的なものがありましたらご指摘いただければと思います。