ATTACHで開かれたSQLiteデータベースファイルのテーブルを一覧表示する方法は?


1197

SQLite 3コマンドラインツールのコマンドでアタッチした後、SQLiteデータベースファイル内のテーブルとそれらのテーブル内の行を一覧表示するために使用できるSQLは何ですか?ATTACH



2
興味がある場合、以下はsqliteの便利なGUIです。sqlitestudio.plデータベース、テーブルの詳細を表示するためのアクセスを非常に迅速に提供し、優れたクエリエディターも備えています...
James Oravec

17
.tablesテーブルおよび.schema ?TABLE?特定のテーブルのスキーマ。
H6。

.table 'bank_%'または.table '%_empl'、プレフィックス/サフィックスをクエリするための有効な構文!
ジヴェンコア

回答:


576

.tables、および.schema「ヘルパー」機能は、アタッチされたデータベースの中に見ていない:彼らだけのクエリSQLITE_MASTER「メイン」データベースのテーブル。したがって、使用した場合

ATTACH some_file.db AS my_db;

その後、あなたがする必要があります

SELECT name FROM my_db.sqlite_master WHERE type='table';

一時テーブルは.tablesどちらにも表示されないことに注意してください。そのためにリストsqlite_temp_masterする必要があります。

SELECT name FROM sqlite_temp_master WHERE type='table';

121
"SELECT name FROM sqlite_master WHERE type='table'"私にのみ
有効

3
SELECT SELECT FROM FROM my_db.sqlite_master WHERE type = 'table'; これは、(添付DB用)私のために動作しませんし、それがようなエラーがスローされます。そのようなテーブルが存在「my_db.sqlite_master」
カニカ

一時テーブルとはどういう意味ですか?SQLite dbファイルを開いたときに何かありますか?
Ewoks

一時テーブルは、CREATE TEMPORARY TABLESQLコマンドで作成されたテーブルです。それらのコンテンツは、現在のデータベース接続が閉じられると削除され、データベースファイルに保存されることはありません。
アンソニーウィリアムズ

1
sqlite3のコマンドモードで実行すると、ATTACH "some_file.db" AS my_db; それは働きました!
John_J

1272

SQLiteデータベースのテーブルを表示するには、いくつかの手順があります。

  1. データベース内のテーブルを一覧表示します。

    .tables
  2. テーブルがどのように見えるかをリストします。

    .schema tablename
  3. テーブル全体を印刷します。

    SELECT * FROM tablename;
  4. 利用可能なすべてのSQLiteプロンプトコマンドを一覧表示します。

    .help

45
.table.tables両方が許可されています。そのことについては、.tasqlite3のはあいまいで任意のコマンドを受け入れるために、同様に動作します。ヘルプによると、コマンドの名前は確かに ".tables"です(まだ誰かが注意を払っている場合)。
dbn 2013

29
(これは受け入れられる答えであるはずです、それは物事を行うための最もsqlite-yの方法です)。
dbn 2013

6
.tables1つ以上のデータベースを開いた場合、テーブルは表示されませんATTACH '<path>' AS <name>;が、ラッセの答えは表示されます。OPがATTACHingについて言及したので、私は彼がこの回答を受け入れないのは正しかったと信じています。編集:ちょうど下のアンソニーと他の人たちもこれを指摘していることに気づきました。
アンチプレックス2013年

2
@dbw:必ずしも必要ではありません。SQLiteまたはMySql(私の場合)を使用できるDBラッパーを実行しているとしましょう。より多くのSQL準拠コマンドを使用すると、DBベンダー固有のコマンドを使用する場合よりも、他の言語でラップされたものを移植するのが簡単になります。
Valentin Heinitz 2013

「... sqlite3はあいまいでないコマンドを受け入れます...」あいにく、あいまいなコマンドも受け入れます。たとえば、「。s」は「.show」として解釈されますが、「。schema」、「。separator」、または「.stats」も可能性があります。あいまいなコマンドを受け入れない場合は、可能性のリストはありません

442

次のように、sqlite_masterテーブルを通過する必要があるようです。

SELECT * FROM dbname.sqlite_master WHERE type='table';

次にSELECT、行を確認するために、手動でを使用して各テーブルを調べます。

.DUMPそして.SCHEMAコマンドは、すべてのデータベースを参照してください表示されません。


120
読みやすく、将来使用するために覚えやすいものではありません。組み込み.tablesコマンドはより直感的です

24
@Gryllida:これは有効なSQLなので、どのSQL-APIからでも使用できます。組み込みコマンドはすべての場所でサポートされているわけではありません。
Valentin Heinitz 2013

2
@DoktorJアタッチ.tablesされたデータベースのテーブルを表示するように変更されましたか?
Lasse V. Karlsen 2013年

4
そのデータベースでは、はい。ただし、この質問は、アタッチしたデータベースのテーブルを表示することに関するものでした。している.tablesコマンドは、だけでなく、それらを表示するように変更されていますか?
Lasse V. Karlsen 2013年

4
どー!読解に失敗しました...どういうわけかATTACH参照をキャッチできませんでした... 2回> _ <
Doktor J

162

すべてのテーブルを表示するには、

SELECT name FROM sqlite_master WHERE type = "table"

すべての行を表示するには、すべてのテーブルを反復処理して、それぞれにSELECT *を実行するだけでよいと思います。しかし、おそらくDUMPはあなたが求めているものですか?


16
質問に本当に答えた唯一の回答に感謝します...使用できるコマンドではなく、「SQLとは」...ありがとう!
Brad Parks

また、これは1行に1つのテーブル名を出力しますが、.tablesはテーブル名の複数の列を出力します(煩わしい/役に立たない)。
シェーン

68

使用.help可能なコマンドを確認するために使用します。

.table

このコマンドは、現在のデータベースにあるすべてのテーブルを表示します。


奇妙な、それは正しくなければなりませんが、私はそれを使用する場合は動作しません
ユルゲン・K.

42

SQLiteコマンドラインでこれに使用できるコマンドがあります:

.tables ?PATTERN?      List names of tables matching a LIKE pattern

これは次のSQLに変換されます。

SELECT name FROM sqlite_master
WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'
UNION ALL
SELECT name FROM sqlite_temp_master
WHERE type IN ('table','view')
ORDER BY 1

36

テーブルを一覧表示するには、次の操作も実行できます。

SELECT name FROM sqlite_master
WHERE type='table';

それで... cur.execute(""" SELECT name FROM sqlite_master WHERE type='table';""")またはいいえ?それは私にとってはうまくいきませんが、このコードがどこで実行されることになっているかはわかりません。
jbuddy_13


24

このクエリを使用して取得します。

SELECT name FROM sqlite_master WHERE type='table'

そしてiOSで使用するには:

NSString *aStrQuery=[NSString stringWithFormat:@"SELECT name FROM sqlite_master WHERE type='table'"];

16

ドキュメントによると、MySQLに相当するものは次のとおりSHOW TABLES;です。

「.tables」コマンドは、リストモードを設定してから次のクエリを実行するのに似ています。

SELECT name FROM sqlite_master
  WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'
UNION ALL
SELECT name FROM sqlite_temp_master
  WHERE type IN ('table','view')
ORDER BY 1;

ただし、単一のテーブルが存在するかどうかを確認する場合(またはその詳細を取得する場合)は、@ LuizGeronの回答を参照してください。


15

SQLite 3の最新バージョンでは、次のコマンドを発行できます。

.fullschema

すべてのcreateステートメントを確認します。


SQLiteバージョン3.7.13 2012-07-17 17:46:21手順に「.help」と入力します。「;」で終了するSQLステートメントを入力します。sqlite> .fullschemaエラー:不明なコマンドまたは無効な引数: "fullschema"。「.help」と入力してヘルプを表示
Mona Jalal

2
2012年のバージョンを使用している
コショウ

12

これを行う最も簡単な方法は.dump、SQLite 3シェルツールを呼び出した後にアタッチするのではなく、データベースを直接開いてコマンドを使用することです。

したがって...(OSコマンドラインプロンプトが$であると想定)の代わりに$sqlite3

sqlite3> ATTACH database.sqlite as "attached"

OSコマンドラインからデータベースを直接開きます。

$sqlite3 database.sqlite
sqlite3> .dump

10

を介してunion all、すべてのテーブルを1つのリストに結合します。

select name
from sqlite_master 
where type='table'

union all 

select name 
from sqlite_temp_master 
where type='table'


7

SQLiteの公式リファレンスについて誰も言及していないので、この見出しの下でそれを参照することは役立つと思います。

https://www.sqlite.org/cli.html

このリンクで説明されているコマンドを使用して、データベースを操作できます。さらに、Windows OS使用していて、コマンドシェルの場所がわからない場合は、SQLiteのサイトにあります。

https://www.sqlite.org/download.html

ダウンロード後、sqlite3.exeファイルをクリックしてSQLiteコマンドシェルを初期化します。初期化されると、デフォルトでは、このSQLiteセッションはディスク上のファイルではなくメモリ内データベースを使用するため、セッションが終了するとすべての変更が失われます。永続ディスクファイルをデータベースとして使用するには、ターミナルウィンドウが起動した直後に「.open ex1.db」コマンドを入力します。

上記の例では、「ex1.db」という名前のデータベースファイルが開かれて使用され、以前に存在していなかった場合は作成されます。絶対パス名を使用して、ファイルが含まれていると思われるディレクトリにファイルが存在することを確認してください。ディレクトリの区切り文字としてスラッシュを使用します。つまり、「c:\ work \ ex1.db」ではなく、「c:/work/ex1.db」を使用します。

以前に選択したデータベースのすべてのテーブルを表示するには、上記のリンクで説明されているように、コマンド.tablesを入力します。

Windowsで作業している場合、このsqlite.exeファイルを他のPythonファイルと同じフォルダーに移動すると便利だと思います。このように、Pythonファイルは.dbファイルに書き込み、SQLiteシェルは同じパスにあります。


5

「.schema」コマンドは、上記のテーブルの作成に使用されたステートメントを表示することにより、使用可能なテーブルとその行をリストします。

sqlite> create table_a(id int、a int、b int);
sqlite> .schema table_a
CREATE TABLE table_a(id int、a int、b int);

1

すべてのデータベースを表示する.da-「メイン」と呼ばれるデータベース

このデータベースのテーブルは、

sqlite_masterから1つずつ異なるtbl_nameを選択します。

アタッチされたデータベースには、ステートメントATTACHでASで選択したプレフィックスが必要です(例:aa(、bb、cc ...))。

aa.sqlite_masterから1 つずつ異なるtbl_nameを選択します。

ここでもビューが表示されることに注意してください。これらを除外するには、type = 'table' を 'order' 前に 追加し ます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.