0
0

More than 3 years have passed since last update.

[SQLite3 + ruby] テーブル名とカラム名を取得する

Posted at

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つの情報が入った配列が、テーブルの数だけ配列としてまとめられています。

  1. type
  2. name
  3. tbl_name
  4. rootpage
  5. 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(テーブル名)')

カラムの情報も配列の配列で返ってきます。

  1. cid
  2. name
  3. type
  4. notnull
  5. dflt_value
  6. 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も勉強中です。
間違いがありましたらご指摘をお願いします。
また、全体的に拙いものですし、こうした方がいいよ的なものがありましたらご指摘いただければと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0