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


373

iPhoneアプリを新しいデータベースバージョンに移行したい。一部のバージョンを保存していないため、特定の列名が存在するかどうかを確認する必要があります。

このStackoverflowエントリは、選択を行うことを提案します

SELECT sql FROM sqlite_master
WHERE tbl_name = 'table_name' AND type = 'table'

結果を解析します。

それは一般的な方法ですか?代替案?


の具体的なケースについては、列名の簡単なリストSQLite.swiftについてはこの質問と回答を参照してください。移行の問題については、このリストを参照してください。
Suragch

回答:


586
PRAGMA table_info(table_name);

すべての列名のリストが表示されます。


19
ただし、そのテーブルから選択することはできません。それだけで迷惑です。私はこのようなことを試みています...しかしそれはうまくいきませんcreate temporary table TmpCols (cid integer, name text, type text, nn bit, dflt_value, pk bit); .mode insert TmpCols .output cols PRAGMA TABLE_INFO('yourtable'); .read cols .mode csv .output stdout
ジェイソン

ただ、アンドロイド、書き込みにSQLiteDatabaseのコード用語にこれを置くためにdb.rawQuery("PRAGMA table_info(" + tablename + ")", null);
ヌーメノン

4
これはビューの場合にも機能します。プラグマtable_info(View_Name); これにより、ビューのすべての列がリストされます

selectステートメントの最後に「limit 0」を貼り付けないのはなぜですか?int cols = sqlite3_column_count(stmt); fprintf(stdout、 "%d columns \ n"、cols); for(int i = 0; i <cols; i ++)fprintf(stdout、 "%d。%s \ n"、i、sqlite3_column_name(stmt、i));
Erik Aronesty、2015年

@ErikAronesty制限0は列を返しません。
William Entriken

213

sqliteデータベースがある場合は、sqlite3コマンドラインプログラムと次のコマンドを使用します。

データベース内のすべてのテーブルをリストするには:

.tables

特定のスキーマを表示するにはtablename

.schema tablename

8
出力は(おそらく)「可読」ではありませんが、これは覚えやすいですPRAGMA table_info(table_name);
Nick Tomlin

8
@NickTomlin残念ながら、ドットコマンドは有効なSQLではないため、このメソッドにはsqlite3コマンドラインプログラムが必要です。
マイケル

188

もしあなたがそうするなら

.headers ON

希望する結果が得られます。


3
ヘッダーを下のコンテンツに合わせる方法は?
Sunnyday

6
常にオンにするには.sqlitercファイルに入れます
ruffin

これは空のテーブルで機能しますか?列名がまだ表示されない
Christopher Pisz

いくつかの理由でわからないが、PRAGMA方法と.schema方法の両方が私にとってうまくいかなかった。しかし、これは問題なく動作します。
user3768495

114

私のような超初心者のためだけに

PRAGMA table_info('table_name') 

以下に示すように、それをprepareステートメントとして使用します。これにより、テーブルに関連する値が入力されていることを除いて、次のようなテーブルが選択されます。

cid         name        type        notnull     dflt_value  pk        
----------  ----------  ----------  ----------  ----------  ----------
0           id          integer     99                      1         
1           name                    0                       0

idとnameは列の実際の名前です。したがって、その値を取得するには、次を使用して列名を選択する必要があります。

//returns the name
sqlite3_column_text(stmt, 1);
//returns the type
sqlite3_column_text(stmt, 2);

現在の行の列の名前を返します。それらすべてを取得するか、必要なものを見つけるには、すべての行を反復処理する必要があります。これを行う最も簡単な方法は、以下の方法です。

//where rc is an int variable if wondering :/
rc = sqlite3_prepare_v2(dbPointer, "pragma table_info ('your table name goes here')", -1, &stmt, NULL);

if (rc==SQLITE_OK)
{
    //will continue to go down the rows (columns in your table) till there are no more
    while(sqlite3_step(stmt) == SQLITE_ROW)
    {
        sprintf(colName, "%s", sqlite3_column_text(stmt, 1));
        //do something with colName because it contains the column's name
    }
}

46

クエリの出力に列名を含め、列として正しく配置する場合は、次のコマンドをで使用しますsqlite3

.headers on
.mode column

次のような出力が得られます。

sqlite> .headers on
sqlite> .mode column
sqlite> select * from mytable;
id          foo         bar
----------  ----------  ----------
1           val1        val2
2           val3        val4


14

ここに記載されていない列名のリストを取得する別の方法は、プラグマ関数から選択することです。

SELECT name FROM PRAGMA_TABLE_INFO('your_table');
name      
tbl_name  
rootpage  
sql

次のコマンドを実行して、特定の列が存在するかどうかを確認できます。

SELECT 1 FROM PRAGMA_TABLE_INFO('your_table') WHERE name='sql';
1

これは、sqlite_masterまたはpragma table_infoからのselect sqlの結果を解析したくない場合に使用します。

参照:

https://www.sqlite.org/pragma.html#pragfunc


すてきなクリーンなアプローチ。これまでは、PRAGMAの機能を知りませんでした。ありがとうございました。
Faheem Mitha



7

私はそれが古いスレッドであることを知っていますが、最近私は同じものが必要で、きちんとした方法を見つけました:

SELECT c.name FROM pragma_table_info('your_table_name') c;

1
もしかして:where t.name = 'table';
Luuk

私の答えからきちんとした方法を見つけましたか?😂
user1461607

6

列情報を取得するには、次のスニペットを使用できます。

String sql = "select * from "+oTablename+" LIMIT 0";
Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery(sql);
ResultSetMetaData mrs = rs.getMetaData();
for(int i = 1; i <= mrs.getColumnCount(); i++)
{
    Object row[] = new Object[3];
    row[0] = mrs.getColumnLabel(i);
    row[1] = mrs.getColumnTypeName(i);
    row[2] = mrs.getPrecision(i);
}

これはビュー、結合などで動作します-しかし、これはどのdbラッパーですか?
Erik Aronesty、2015年

それは単にjdbcです。ラッパーはありません。
Devolus

6
//JUST little bit modified the answer of giuseppe  which returns array of table columns
+(NSMutableArray*)tableInfo:(NSString *)table{

    sqlite3_stmt *sqlStatement;

    NSMutableArray *result = [NSMutableArray array];

    const char *sql = [[NSString stringWithFormat:@"PRAGMA table_info('%@')",table] UTF8String];

    if(sqlite3_prepare(md.database, sql, -1, &sqlStatement, NULL) != SQLITE_OK)

    {
        NSLog(@"Problem with prepare statement tableInfo %@",
                [NSString stringWithUTF8String:(const char *)sqlite3_errmsg(md.database)]);

    }

    while (sqlite3_step(sqlStatement)==SQLITE_ROW)
    {
        [result addObject:
          [NSString stringWithUTF8String:(char*)sqlite3_column_text(sqlStatement, 1)]];
    }

    return result;
}

4

sqliteコンソールの.schemaは、テーブルの中にいると、次のようになります...

sqlite>.schema
CREATE TABLE players(
id integer primary key,
Name varchar(255),
Number INT,
Team varchar(255)

3
-(NSMutableDictionary*)tableInfo:(NSString *)table
{
  sqlite3_stmt *sqlStatement;
  NSMutableDictionary *result = [[NSMutableDictionary alloc] init];
  const char *sql = [[NSString stringWithFormat:@"pragma table_info('%s')",[table UTF8String]] UTF8String];
  if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK)
  {
    NSLog(@"Problem with prepare statement tableInfo %@",[NSString stringWithUTF8String:(const char *)sqlite3_errmsg(db)]);

  }
  while (sqlite3_step(sqlStatement)==SQLITE_ROW)
  {
    [result setObject:@"" forKey:[NSString stringWithUTF8String:(char*)sqlite3_column_text(sqlStatement, 1)]];

  }

  return result;
  }

3
function getDetails(){
var data = [];
dBase.executeSql("PRAGMA table_info('table_name') ", [], function(rsp){
    if(rsp.rows.length > 0){
        for(var i=0; i<rsp.rows.length; i++){
            var o = {
                name: rsp.rows.item(i).name,
                type: rsp.rows.item(i).type
            } 
            data.push(o);
        }
    }
    alert(rsp.rows.item(0).name);

},function(error){
    alert(JSON.stringify(error));
});             
}

3

手遅れだと知っていますが、これは他の人を助けるでしょう。

テーブルの列名を見つけるには、実行する必要がselect * from tbl_nameありますsqlite3_stmt *。結果はで得られます。そして、フェッチされた列全体に対して列が繰り返されることを確認します。以下のコードも参考にしてください。

// sqlite3_stmt *statement ;
int totalColumn = sqlite3_column_count(statement);
for (int iterator = 0; iterator<totalColumn; iterator++) {
   NSLog(@"%s", sqlite3_column_name(statement, iterator));
}

これにより、結果セットのすべての列名が出力されます。


2

.schema table_name

これにより、データベースのテーブルの列名が一覧表示されます。

これが役立つことを願っています!!!


0

たぶん、コンソールのテーブルヘッダーを印刷したいだけかもしれません。これは私のコードです:(各テーブル用)

    // ------------------ show header ----------------


    char sqlite_stmt_showHeader[1000];
    snprintf(sqlite_stmt_showHeader, 1000, "%s%s", "SELECT * FROM ", TABLE_NAME_STRING UTF8String]);

    sqlite3_stmt* statement_showHeader;
    sqlite3_prepare_v2(DATABASE, sqlite_stmt_showHeader, -1, &statement_showHeader, NULL);

    int headerColumnSize = sqlite3_column_count(statement_showHeader);

    NSString* headerRow = @"|";

    for (int j = 0; j < headerColumnSize; j++) {
        NSString* headerColumnContent = [[NSString alloc] initWithUTF8String:(const char*)sqlite3_column_name(statement_showHeader, j)];
        headerRow = [[NSString alloc] initWithFormat:@"%@ %@ |", headerRow, headerColumnContent];
    }

    NSLog(@"%@", headerRow);


    sqlite3_finalize(statement_showHeader);

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