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?


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

Antworten:


586
PRAGMA table_info(table_name);

Sie erhalten eine Liste aller Spaltennamen.


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

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.


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

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

18

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

.schema tablename

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


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%')

12

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

sqlite3 -header

gibt auch das gewünschte Ergebnis


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;

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

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

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)

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

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.


2

.schema table_name

Dadurch werden die Spaltennamen der Tabelle aus der Datenbank aufgelistet.

Hoffe das wird helfen !!!


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 ---------------------
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.