Bagaimana cara mendapatkan daftar nama kolom pada database Sqlite3?


373

Saya ingin memigrasikan aplikasi iPhone saya ke versi database baru. Karena saya tidak menyimpan beberapa versi, saya perlu memeriksa apakah ada nama kolom tertentu.

Entri Stackoverflow ini menyarankan untuk melakukan pemilihan

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

dan parsing hasilnya.

Apakah itu cara yang biasa? Alternatif?


Untuk kasus spesifik SQLite.swift, lihat pertanyaan dan jawaban ini untuk daftar nama kolom yang sederhana atau yang ini untuk masalah migrasi.
Suragch

Jawaban:


586
PRAGMA table_info(table_name);

akan memberi Anda daftar semua nama kolom.


19
tetapi Anda tidak dapat memilih dari tabel itu. Benar-benar menjengkelkan. Saya mencoba sesuatu seperti ini ... tetapi tidak berhasilcreate 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
Jason

Hanya untuk memasukkan ini ke dalam ketentuan kode untuk SQLiteDatabase di Android, tulisdb.rawQuery("PRAGMA table_info(" + tablename + ")", null);
Noumenon

4
Ini juga akan berfungsi jika View. PRAGMA table_info (View_Name); Ini akan mencantumkan semua kolom View

mengapa tidak menempelkan "batas 0" di akhir pernyataan pilih? int cols = sqlite3_column_count (stmt); fprintf (stdout, "% d kolom \ n", cols); untuk (int i = 0; i <cols; i ++) fprintf (stdout, "% d.% s \ n", i, sqlite3_column_name (stmt, i));
Erik Aronesty

@ErikAronesty limit 0 tidak mengembalikan kolom apa pun.
William Entriken

213

Jika Anda memiliki database sqlite, gunakan program baris perintah sqlite3 dan perintah ini:

Untuk membuat daftar semua tabel dalam database:

.tables

Untuk menampilkan skema untuk yang diberikan tablename:

.schema tablename

8
Meskipun hasilnya tidak "terbaca" (mungkin) is_much_ ini lebih mudah diingat daripadaPRAGMA table_info(table_name);
Nick Tomlin

8
@NickTomlin Sayangnya, metode ini mengharuskan memiliki program baris perintah sqlite3, karena perintah dot tidak SQL yang valid.
Michael

188

Jika kamu melakukan

.headers ON

Anda akan mendapatkan hasil yang diinginkan.


3
bagaimana cara menyelaraskan header dengan konten di bawah ini?
Sunnyday

6
Dan untuk selalu mengaktifkannya, letakkan di file Anda.sqliterc .
ruffin

Haruskah ini bekerja dengan meja kosong? Saya masih belum melihat nama kolom
Christopher Pisz

Untuk beberapa alasan saya tidak tahu, PRAGMAmetode dan .schemametode keduanya tidak bekerja untuk saya. Tapi yang ini berfungsi dengan baik.
user3768495

114

Hanya untuk noobs super seperti saya bertanya-tanya bagaimana atau apa yang dimaksud orang

PRAGMA table_info('table_name') 

Anda ingin menggunakannya sebagai pernyataan persiapan seperti yang ditunjukkan di bawah ini. Melakukannya memilih tabel yang terlihat seperti ini kecuali diisi dengan nilai yang berkaitan dengan tabel Anda.

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

Di mana id dan nama adalah nama sebenarnya dari kolom Anda. Jadi untuk mendapatkan nilai itu, Anda perlu memilih nama kolom dengan menggunakan:

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

Yang akan mengembalikan nama kolom baris saat ini. Untuk mengambil semuanya atau menemukan yang Anda inginkan, Anda harus mengulangi semua baris. Cara paling sederhana untuk melakukannya adalah dengan cara di bawah ini.

//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

Jika Anda ingin output dari kueri Anda menyertakan nama kolom dan disejajarkan dengan benar sebagai kolom, gunakan perintah ini di sqlite3:

.headers on
.mode column

Anda akan mendapatkan output seperti:

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

18

Untuk mendapatkan daftar kolom, Anda cukup menggunakan:

.schema tablename

3
Ini tidak akan menampilkan kolom yang ditambahkan dengan pernyataan ALTER.
RajeshM

14

Cara alternatif untuk mendapatkan daftar nama kolom yang tidak disebutkan di sini adalah memilih dari fungsi pragma:

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

Anda dapat memeriksa apakah ada kolom tertentu dengan menjalankan:

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

Ini adalah apa yang Anda gunakan jika Anda tidak ingin melewatkan hasil dari memilih sql dari sqlite_master atau pragma table_info.

Referensi:

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


Pendekatan bersih yang bagus. Dan saya tidak tahu fungsi PRAGMA sebelum ini. Terima kasih.
Faheem Mitha

13

Saat Anda menjalankan sqlite3cli, ketikkan:

sqlite3 -header

juga akan memberikan hasil yang diinginkan


12

Anda dapat menggunakan pernyataan Suka jika Anda mencari kolom tertentu

ex:

SELECT * FROM sqlite_master where sql like('%LAST%')

7

Saya tahu ini adalah utas lama, tetapi baru-baru ini saya membutuhkan yang sama dan menemukan cara yang rapi:

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

1
Anda memang bermaksud:where t.name = 'table';
Luuk

Apakah Anda menemukan cara yang rapi dari jawaban saya? 😂
user1461607

6

Untuk mendapatkan informasi kolom, Anda dapat menggunakan cuplikan berikut:

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);
}

ini bekerja dengan pandangan, bergabung, dll - tetapi apa bungkus db ini?
Erik Aronesty

Ini hanya jdbc. Tidak ada pembungkus
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

.schema di konsol sqlite ketika Anda memiliki Anda di dalam tabel itu terlihat seperti ini untuk saya ...

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

Saya tahu sudah terlambat tetapi ini akan membantu lainnya.

Untuk menemukan nama kolom dari tabel, Anda harus menjalankan select * from tbl_namedan Anda akan mendapatkan hasilnya sqlite3_stmt *. dan periksa kolom iterate di atas total kolom yang diambil. Silakan merujuk kode berikut untuk hal yang sama.

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

Ini akan mencetak semua nama kolom dari set hasil.


2

.schema table_name

Ini akan mencantumkan nama kolom dari tabel dari database.

Semoga ini bisa membantu !!!


0

Mungkin Anda hanya ingin mencetak header tabel di konsol. Ini adalah kode saya: (untuk setiap tabel)

    // ------------------ 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 ---------------------
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.