Wie erhalte ich eine Liste der Spaltennamen in der Sqlite3-Datenbank?

373

Ich möchte meine iPhone-App auf eine neue Datenbankversion migrieren. Da ich keine Version gespeichert habe, muss ich überprüfen, ob bestimmte Spaltennamen vorhanden sind.

Dieser Stackoverflow-Eintrag schlägt vor, die Auswahl vorzunehmen

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

und analysieren Sie das Ergebnis.

Ist das der übliche Weg? Alternativen?

luebken
quelle
Für den speziellen Fall von SQLite.swiftfinden Sie in dieser Frage und Antwort eine einfache Liste der Spaltennamen oder diese für Migrationsprobleme.
Suragch
Mögliches Duplikat von Wie man eine Liste von Spaltennamen erhält
Owen Pauling

Antworten:

586
PRAGMA table_info(table_name);

Sie erhalten eine Liste aller Spaltennamen.

Nevan König
quelle
19
Sie können jedoch nicht aus dieser Tabelle auswählen. Es ist einfach nur nervig. Ich versuche so etwas ... aber es funktioniert nichtcreate 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
Nur um dies in Codebegriffe für SQLiteDatabase auf Android zu setzen, schreiben Siedb.rawQuery("PRAGMA table_info(" + tablename + ")", null);
Noumenon
4
Dies funktioniert auch bei View. PRAGMA table_info (View_Name); Dies wird alle Spalten einer Ansicht
Warum nicht einfach "limit 0" am Ende einer select-Anweisung festhalten? int cols = sqlite3_column_count (stmt); fprintf (stdout, "% d Spalten \ n", Spalten); für (int i = 0; i <cols; i ++) fprintf (stdout, "% d.% s \ n", i, sqlite3_column_name (stmt, i));
Erik Aronesty
@ErikAronesty limit 0 gibt keine Spalten zurück.
William Entriken
213

Wenn Sie über die SQLite-Datenbank verfügen, verwenden Sie das Befehlszeilenprogramm sqlite3 und die folgenden Befehle:

So listen Sie alle Tabellen in der Datenbank auf:

.tables

So zeigen Sie das Schema für eine bestimmte tablename:

.schema tablename
George Hilliard
quelle
8
Obwohl die Ausgabe (vielleicht) nicht so "lesbar" ist, ist dies viel einfacher zu merken alsPRAGMA table_info(table_name);
Nick Tomlin
8
@NickTomlin Leider erfordert diese Methode das Befehlszeilenprogramm sqlite3, da Punktbefehle kein gültiges SQL sind.
Michael
188

Wenn Sie tun

.headers ON

Sie erhalten das gewünschte Ergebnis.

Roland Orre
quelle
3
Wie richte ich Header an den unten stehenden Inhalten aus?
Sonnentag
6
Und um das immer zu haben, legen Sie es in Ihre .sqlitercDatei .
Ruffin
Sollte das mit einem leeren Tisch funktionieren? Ich sehe immer noch keine Spaltennamen
Christopher Pisz
Aus einigen Gründen, die ich nicht kenne, haben sowohl die PRAGMAMethode als auch die .schemaMethode bei mir nicht funktioniert. Aber dieser funktioniert gut.
user3768495
114

Nur für Super-Noobs wie mich, die sich fragen, wie oder was die Leute damit gemeint haben

PRAGMA table_info('table_name') 

Sie möchten dies als Vorbereitungsanweisung verwenden, wie unten gezeigt. Dadurch wird eine Tabelle ausgewählt, die so aussieht, außer dass sie mit Werten gefüllt ist, die sich auf Ihre Tabelle beziehen.

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

Wobei ID und Name die tatsächlichen Namen Ihrer Spalten sind. Um diesen Wert zu erhalten, müssen Sie den Spaltennamen auswählen, indem Sie Folgendes verwenden:

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

Dadurch wird der Spaltenname der aktuellen Zeile zurückgegeben. Um sie alle zu erfassen oder die gewünschte zu finden, müssen Sie alle Zeilen durchlaufen. Der einfachste Weg, dies zu tun, wäre die folgende.

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

Wenn die Ausgabe Ihrer Abfragen Spaltennamen enthalten und korrekt als Spalten ausgerichtet werden soll, verwenden Sie die folgenden Befehle in sqlite3:

.headers on
.mode column

Sie erhalten folgende Ausgabe:

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

Um eine Liste der Spalten zu erhalten, können Sie einfach Folgendes verwenden:

.schema tablename
Aditya Joardar
quelle
3
Dies zeigt keine Spalten an, die mit der ALTER-Anweisung hinzugefügt wurden.
RajeshM
14

Eine alternative Möglichkeit, eine Liste der hier nicht erwähnten Spaltennamen zu erhalten, besteht darin, aus einer Pragma-Funktion auszuwählen:

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

Sie können überprüfen, ob eine bestimmte Spalte vorhanden ist, indem Sie Folgendes ausführen:

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

Dies ist, was Sie verwenden, wenn Sie das Ergebnis der Auswahl von sql aus sqlite_master oder pragma table_info nicht analysieren möchten.

Referenz:

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

user1461607
quelle
Schöner, sauberer Ansatz. Und ich kannte vorher keine PRAGMA-Funktionen. Vielen Dank.
Faheem Mitha
12

Sie können die Like-Anweisung verwenden, wenn Sie nach einer bestimmten Spalte suchen

Ex:

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

Wenn Sie die sqlite3CLI ausführen , geben Sie Folgendes ein:

sqlite3 -header

gibt auch das gewünschte Ergebnis

Sam Houston
quelle
7

Ich weiß, dass es ein alter Thread ist, aber kürzlich brauchte ich den gleichen und fand einen ordentlichen Weg:

SELECT c.name FROM pragma_table_info('your_table_name') c;
Slawischer Petrow
quelle
1
Du hast gemeint:where t.name = 'table';
Luuk
Hast du den richtigen Weg aus meiner Antwort gefunden? 😂
user1461607
6

Um die Spalteninformationen zu erhalten, können Sie das folgende Snippet verwenden:

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
quelle
Dies funktioniert mit Ansichten, Verknüpfungen usw. - aber welcher DB-Wrapper ist das?
Erik Aronesty
Es ist einfach jdbc. Kein Wrapper.
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
quelle
4

.schema in sqlite console Wenn Sie sich in der Tabelle befinden, sieht es für mich ungefähr so ​​aus ...

sqlite>.schema
CREATE TABLE players(
id integer primary key,
Name varchar(255),
Number INT,
Team varchar(255)
Kevin Hu
quelle
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
quelle
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
quelle
3

Ich weiß, dass es zu spät ist, aber das wird anderen helfen.

Um den Spaltennamen der Tabelle zu finden, sollten Sie ausführen select * from tbl_nameund Sie erhalten das Ergebnis in sqlite3_stmt *. und überprüfen Sie, ob die Spalte über die insgesamt abgerufene Spalte iteriert. Bitte beziehen Sie sich auf den folgenden Code.

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

Dadurch werden alle Spaltennamen der Ergebnismenge gedruckt.

Rohit Kale
quelle
2

.schema table_name

Dadurch werden die Spaltennamen der Tabelle aus der Datenbank aufgelistet.

Hoffe das wird helfen !!!

Sakthi Velan
quelle
0

Vielleicht möchten Sie nur die Tabellenüberschriften auf der Konsole drucken. Dies ist mein Code: (für jede Tabelle)

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