Jak uzyskać listę nazw kolumn w bazie danych Sqlite3?


373

Chcę migrować moją aplikację na iPhone'a do nowej wersji bazy danych. Ponieważ nie mam zapisanej żadnej wersji, muszę sprawdzić, czy istnieją pewne nazwy kolumn.

Ten wpis Stackoverflow sugeruje dokonanie wyboru

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

i przeanalizuj wynik.

Czy to wspólny sposób? Alternatywy?


Aby SQLite.swiftzapoznać się z konkretnym przypadkiem , zobacz to pytanie i odpowiedź, aby uzyskać prostą listę nazw kolumn lub dotyczącą problemów z migracją.
Suragch

Odpowiedzi:


586
PRAGMA table_info(table_name);

dostaniesz listę wszystkich nazw kolumn.


19
ale nie możesz wybrać z tej tabeli. To po prostu irytujące. Próbuję czegoś takiego ... ale to nie działacreate 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

Aby umieścić to w terminach kodowych dla SQLiteDatabase na Androida, napiszdb.rawQuery("PRAGMA table_info(" + tablename + ")", null);
Noumenon

4
Działa to również w przypadku View. PRAGMA table_info (View_Name); Spowoduje to wyświetlenie wszystkich kolumn widoku

dlaczego nie po prostu nakleić „limit 0” na końcu instrukcji select? int cols = sqlite3_column_count (stmt); fprintf (stdout, "% d kolumny \ n", cols); for (int i = 0; i <cols; i ++) fprintf (stdout, "% d.% s \ n", i, sqlite3_kolumna_pliku (stmt, i));
Erik Aronesty

@ErikAronesty limit 0 nie zwraca żadnych kolumn.
William Entriken

213

Jeśli masz bazę danych sqlite, użyj programu wiersza polecenia sqlite3 i tych poleceń:

Aby wyświetlić listę wszystkich tabel w bazie danych:

.tables

Aby pokazać schemat dla danego tablename:

.schema tablename

8
Chociaż wynik nie jest tak „czytelny” (być może), jest to łatwiejsze do zapamiętania niżPRAGMA table_info(table_name);
Nick Tomlin

8
@NickTomlin Niestety, ta metoda wymaga posiadania programu wiersza poleceń sqlite3, ponieważ polecenia kropkowe nie są poprawnym SQL.
Michael

188

Jeśli zrobisz

.headers ON

uzyskasz pożądany rezultat.


3
jak wyrównać nagłówki z treścią poniżej?
Sunnyday

6
Aby zawsze mieć to na sobie, umieść to w swoim .sqlitercpliku .
ruffin

Czy to powinno działać z pustym stołem? Nadal nie widzę nazw kolumn
Christopher Pisz

Z niektórych powodów nie wiem, zarówno metoda, jak PRAGMAi .schemametoda nie działały dla mnie. Ale ten działa dobrze.
user3768495,

114

Tylko dla super noobów, takich jak ja, zastanawiających się, jak i co ludzie mieli na myśli

PRAGMA table_info('table_name') 

Chcesz użyć tego jako wyciągu przygotowawczego, jak pokazano poniżej. W ten sposób wybiera się tabelę, która wygląda tak, z wyjątkiem tego, że jest zapełniana wartościami odnoszącymi się do tabeli.

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

Gdzie id i nazwa to rzeczywiste nazwy twoich kolumn. Aby uzyskać tę wartość, musisz wybrać nazwę kolumny, używając:

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

Co zwróci nazwę kolumny bieżącego wiersza. Aby złapać je wszystkie lub znaleźć ten, który chcesz, musisz iterować przez wszystkie rzędy. Najprostszym sposobem na to byłoby w następujący sposób.

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

Jeśli chcesz, aby dane wyjściowe Twoich zapytań zawierały nazwy kolumn i były poprawnie wyrównane jako kolumny, użyj tych poleceń w sqlite3:

.headers on
.mode column

Otrzymasz dane wyjściowe takie jak:

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

18

Aby uzyskać listę kolumn, możesz po prostu użyć:

.schema tablename

3
To nie pokaże kolumn dodanych z instrukcją ALTER.
RajeshM

14

Alternatywnym sposobem uzyskania listy nazw kolumn nie wymienionych tutaj jest wybranie funkcji pragma:

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

Możesz sprawdzić, czy określona kolumna istnieje, uruchamiając:

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

Tego używasz, jeśli nie chcesz analizować wyniku wyboru sql z sqlite_master lub pragma table_info.

Odniesienie:

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


Ładne czyste podejście. Nie wiedziałem wcześniej o funkcjach PRAGMA. Dziękuję Ci.
Faheem Mitha

12

możesz użyć instrukcji Like, jeśli szukasz konkretnej kolumny

dawny:

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

12

Po uruchomieniu sqlite3cli, wpisując:

sqlite3 -header

da również pożądany rezultat


7

Wiem, że to stary wątek, ale ostatnio potrzebowałem tego samego i znalazłem fajny sposób:

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

1
Miałeś na myśli:where t.name = 'table';
Luuk

znalazłeś dobry sposób na moją odpowiedź? 😂
1461607

6

Aby uzyskać informacje o kolumnie, możesz użyć następującego fragmentu kodu:

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

działa to z widokami, złączeniami itp. - ale co to jest opakowanie db?
Erik Aronesty

To po prostu jdbc. Bez opakowania.
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 w konsoli sqlite, kiedy jesteś w środku, wygląda to dla mnie tak ...

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

Wiem, że jest już za późno, ale to pomoże innym.

Aby znaleźć nazwę kolumny tabeli, powinieneś wykonać, select * from tbl_namea otrzymasz wynik sqlite3_stmt *. i sprawdź iterację kolumny po całej pobranej kolumnie. Odwołaj się do następującego kodu dla tego samego.

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

Spowoduje to wydrukowanie wszystkich nazw kolumn zestawu wyników.


2

.schema table_name

Spowoduje to wyświetlenie nazw kolumn tabeli z bazy danych.

Mam nadzieję, że to pomoże !!!


0

Może po prostu chcesz wydrukować nagłówki tabeli na konsoli. To jest mój kod: (dla każdej tabeli)

    // ------------------ 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 ---------------------
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.