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?

luebken
źródło
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
Możliwy duplikat Jak uzyskać listę nazw kolumn
Owen Pauling

Odpowiedzi:

586
PRAGMA table_info(table_name);

dostaniesz listę wszystkich nazw kolumn.

Nevan King
źródło
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
George Hilliard
źródło
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.

Roland Orre
źródło
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
    }
}
Birdbuster
źródło
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
Owen Pauling
źródło
18

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

.schema tablename
Aditya Joardar
źródło
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

użytkownik1461607
źródło
Ł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%')
Raamalakshmanan
źródło
12

Po uruchomieniu sqlite3cli, wpisując:

sqlite3 -header

da również pożądany rezultat

Sam Houston
źródło
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;
Słowiański Pietrow
źródło
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);
}
Devolus
źródło
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;
}
Dattatray Deokar
źródło
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)
Kevin Hu
źródło
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;
  }
Giuseppe
źródło
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));
});             
}
Om Shankar
źródło
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.

Rohit Kale
źródło
2

.schema table_name

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

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

Sakthi Velan
źródło
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 ---------------------
Neo Wang
źródło