SQLiteデータベースのテーブルの列のリストを取得するにはどうすればよいですか?


102

テーブルの列のリストを取得しようとしています。データベースはSQLiteの最新リリースです(3.6と思います)。SQLクエリでこれを行うコードを探しています。列に関連するメタデータの追加ボーナスポイント(長さ、データ型など)

回答:


134

あなたが探しているものはデータ辞書と呼ばれています。sqliteでは、sqlite_masterテーブル(またはビュー?)

sqlite> create table people (first_name varchar, last_name varchar, email_address varchar);
sqlite> select * from sqlite_master;
table|people|people|2|CREATE TABLE people (first_name varchar, last_name varchar, email_address varchar)

列情報を取得するには、次のpragma table_info(table_name)ステートメントを使用できます。

sqlite> pragma table_info(people);
0|first_name|varchar|0||0
1|last_name|varchar|0||0
2|email_address|varchar|0||0

プラグマステートメントの詳細については、ドキュメントを参照してください。


5
すごい!これをコマンドラインの外からどのように行うのですか?これは自分のCプログラム内からどのように行われますか?
アーロンブラッチャー2013

上記と同じようにObjective-cで実装するには
Nag Raj

2
@ Nag、SQLiteはこれらのコマンドを通常のSQLとして扱い、それに応じて処理し、結果セットを返すだけだと思います。
ブライアンカイル

sqliteの代わりにいくつかのドットショートカットはありselect * from ませんか?
jiggunjer

select * from tableを使用する場合、テーブル内のレコードの数が何百万のレコードの結果である可能性があるかわからない場合、時間とリソースを要します。「制限1」またはそのようなものを追加する必要があります。
Guy Dafny

55

簡単な方法は次のとおりです。

.schema <table>

4
これは本当に答えになるはずです。
Ehtesh Choudhury

19
@EhteshChoudhuryいいえ、そうするべきではありません。質問はSQLクエリを要求しますが、これはそうではありません。
jazzpi

25

質問は古いですが、以下はまだ言及されていません。

多くの場合、もう1つの便利な方法は、次の方法でヘッダーをオンにすることです。

sqlite> .headers on

そして、

sqlite> SELECT ... FROM table

選択したすべてのフィールド(SELECT *を選択した場合はすべて)を示す見出しが出力の上部に表示されます。


私の推測では正しいのは、実際の問題はsqlite3がデフォルトでクエリのヘッダーを提供しないことであり、それが私たち全員が探していたソリューションです。テーブルが長すぎて端末に表示できない場合は、たとえばを追加しますLIMIT 5;最後に忘れないでください。
fralau

16

あなたのsqliteシェルに入るだけです:

$ sqlite3 path/to/db.sqlite3

そして、ちょうどヒット

sqlite> .schema

そして、あなたはすべてを取得します。


1
問題はSQLクエリを探すことです。
エリカ

13

現在のデータベースのすべてのテーブルと列を一覧表示するSELECTステートメントは次のとおりです。

SELECT m.name as tableName, 
       p.name as columnName
FROM sqlite_master m
left outer join pragma_table_info((m.name)) p
     on m.name <> p.name
order by tableName, columnName
;

ありがとう!あなたが変更した場合は、スキーマで注文することができますORDER BYにをtableName, p.cid
mrm 2018年

7

これは、すべてのテーブルとその列、およびOPが要求したときに(ボーナスポイントとして)各列について取得できるすべてのメタデータを一覧表示するクエリです。

SELECT
  m.name AS table_name, 
  p.cid AS col_id,
  p.name AS col_name,
  p.type AS col_type,
  p.pk AS col_is_pk,
  p.dflt_value AS col_default_val,
  p.[notnull] AS col_is_not_null
FROM sqlite_master m
LEFT OUTER JOIN pragma_table_info((m.name)) p
  ON m.name <> p.name
WHERE m.type = 'table'
ORDER BY table_name, col_id

pragma_table_infoクエリで作業する方法を教えてくれた@David Garoutteに感謝します。

このクエリを実行して、すべてのテーブルメタデータを表示します。

SELECT * FROM sqlite_master WHERE type = 'table'

1

上記の上に構築すると、一度にすべてそれを行うことができます:

sqlite3 yourdb.db ".schema"

これにより、実際には列のリストであるテーブルを作成するためのSQLが提供されます。


0

久しぶりですが、遅すぎることはありません…TCLを通訳として同様の質問をしましたが、何回か検索した結果、私にとって何も良いことは見つかりませんでした。それで、私はあなたのDBが「メイン」であることを知って、PRAGMAに基づいた何かを提案します

db eval { PRAGMA main.table_info(<your table name>) } TBL { puts $TBL(name) }

そして配列を使ってリストを取得する

set col_list {}
db eval { PRAGMA main.table_info(<your table name>) } TBL { lappend col_list $TBL(name) }
puts $col_list
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.