Sqlite3 veritabanında sütun adlarının listesi nasıl alınır?


373

İPhone uygulamamı yeni bir veritabanı sürümüne geçirmek istiyorum. Bazı sürümler kaydedilmediğinden, belirli sütun adlarının var olup olmadığını kontrol etmem gerekiyor.

Bu Stackoverflow girişi seçimin yapılmasını önerir

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

ve sonucu ayrıştırır.

Ortak yol bu mu? Alternatifler?


Özgü özel durum için SQLite.swift, bkz bu soru-cevap sütun adlarının basit bir liste veya için bu bir göç sorunları için.
Suragch

Yanıtlar:


586
PRAGMA table_info(table_name);

size tüm sütun adlarının bir listesini alır.


19
ancak bu tablodan seçim yapamazsınız. Sadece sataşmak sinir bozucu. Böyle bir şey deniyorum ... ama işe yaramıyorcreate 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

Bunu Android'de SQLiteDatabase için kod terimlerine koymak için şunu yazın:db.rawQuery("PRAGMA table_info(" + tablename + ")", null);
Noumenon

4
Bu, Görünüm durumunda da çalışır. PRAGMA table_info (Görünüm_Adı); Bu, bir Görünümün tüm sütunlarını listeler

neden bir select deyiminin sonuna "limit 0" yapıştırmıyor? int cols = sqlite3_column_count (stmt); fprintf (stdout, "% d sütun \ n", sütunlar); (int i = 0; i <cols; i ++) fprintf (stdout, "% d.% s \ n", i, sqlite3_column_name (stmt, i));
Erik Aronesty

@ErikAronesty limit 0 herhangi bir sütun döndürmez.
William Entriken

213

Sqlite veritabanınız varsa, sqlite3 komut satırı programını ve şu komutları kullanın:

Veritabanındaki tüm tabloları listelemek için:

.tables

Belirli bir şemanın şemasını göstermek için tablename:

.schema tablename

8
Çıktı "okunabilir" olmasa da (belki de) bu hatırlanması daha kolayPRAGMA table_info(table_name);
Nick Tomlin

8
@NickTomlin Ne yazık ki, nokta komutları geçerli SQL olmadığından, bu yöntem sqlite3 komut satırı programına sahip olmayı gerektirir.
Michael

188

Yaparsan

.headers ON

İstediğiniz sonucu elde edersiniz.


3
başlıkları aşağıdaki içerikle nasıl hizalayabilirim?
Sunnyday

6
Ve bunu her zaman kullanabilmek için .sqlitercdosyanıza koyun .
ruffin

Bu boş bir tablo ile çalışmalı mı? Hala sütun isimlerini göremiyorum
Christopher Pisz

Bilmiyorum bazı nedenlerden dolayı, PRAGMAyöntem ve .schemametot hem benim için çalış yoktu. Ama bu gayet iyi çalışıyor.
user3768495

114

Sadece benim gibi süper noobs için insanların nasıl veya ne anlama geldiğini merak ediyorum

PRAGMA table_info('table_name') 

Bunu, aşağıda gösterildiği gibi hazırlama ifadeniz olarak kullanmak istersiniz. Bunu yaptığınızda, tablonuzla ilgili değerlerle doldurulması dışında, buna benzeyen bir tablo seçilir.

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

Burada id ve ad, sütunlarınızın gerçek adlarıdır. Bu değeri elde etmek için şunu kullanarak sütun adını seçmeniz gerekir:

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

Geçerli satırın sütun adını döndürür. Hepsini yakalamak veya istediğinizi bulmak için tüm satırları tekrarlamanız gerekir. Bunu yapmanın en basit yolu aşağıdaki şekilde olacaktır.

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

Sorgularınızın çıktısının sütun adları içermesini ve sütun olarak doğru hizalanmasını istiyorsanız, şu komutları kullanın sqlite3:

.headers on
.mode column

Gibi çıktı alacaksınız:

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

18

Bir sütun listesi almak için şunları kullanabilirsiniz:

.schema tablename

3
Bu, ALTER deyimiyle eklenen sütunları göstermez.
RajeshM

14

Burada belirtilmeyen sütun adlarının bir listesini almanın alternatif bir yolu, bir pragma işlevinden seçim yapmaktır:

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

Belirli bir sütunun var olup olmadığını kontrol ederek çalıştırabilirsiniz:

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

Sqlite_master veya pragma table_info'dan select sql sonucunu ayrıştırmak istemiyorsanız, bunu kullanırsınız.

Referans:

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


Güzel temiz bir yaklaşım. Ve bundan önce PRAGMA fonksiyonlarını bilmiyordum. Teşekkür ederim.
Faheem Mitha

12

belirli bir sütunu arıyorsanız Like ifadesini kullanabilirsiniz

örn:

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

12

sqlite3Klibi çalıştırdığınızda şunu yazın :

sqlite3 -header

ayrıca istenen sonucu verecektir


7

Eski bir iş parçacığı olduğunu biliyorum, ama son zamanlarda aynı gerekli ve düzgün bir yol bulundu:

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

1
where t.name = 'table';
Şunu mu

cevabımın düzgün yolunu buldun mu? 😂
user1461607

6

Sütun bilgilerini almak için aşağıdaki snippet'i kullanabilirsiniz:

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

Bu görünümler, birleşimler, vb. ile çalışır - ama bu ne db sarıcı?
Erik Aronesty

Sadece jdbc. Sarıcı yok.
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 konsolunda .schema masanın içindeyken benim için böyle bir şey görünüyor ...

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

Çok geç olduğunu biliyorum ama bu başkalarına yardımcı olacak.

Tablonun sütun adını bulmak için, yürütmeniz gerekir select * from tbl_nameve sonucu alırsınız sqlite3_stmt *. ve getirilen toplam sütun üzerindeki sütun yinelemesini kontrol edin. Aynı kod için lütfen aşağıdaki koda bakın.

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

Bu, sonuç kümesinin tüm sütun adlarını yazdırır.


2

.schema table_name

Bu, tablonun sütun adlarını veritabanından listeler.

Umarım bu yardımcı olacaktır !!!


0

Belki de sadece tablo başlıklarını konsolda yazdırmak istersiniz. Bu benim kodum: (her tablo için)

    // ------------------ 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 ---------------------
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.