Як отримати список імен стовпців у базі даних Sqlite3?


373

Я хочу перенести додаток iPhone на нову версію бази даних. Оскільки у мене немає збереженої версії, мені потрібно перевірити, чи існують певні назви стовпців.

Цей запис Stackoverflow пропонує зробити вибір

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

і проаналізувати результат.

Це звичайний шлях? Альтернативи?


У конкретному випадку SQLite.swiftдив. Це запитання та відповідь на простий список назв стовпців або цей на питання щодо міграції.
Сурагч

Відповіді:


586
PRAGMA table_info(table_name);

отримає список усіх імен стовпців.


19
але ви не можете вибрати з цієї таблиці. Це просто прикро. Я намагаюся щось подібне ... але нічого не виходитьcreate 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
Джейсон

Просто щоб ввести це в кодові терміни для SQLiteDatabase на Android, напишітьdb.rawQuery("PRAGMA table_info(" + tablename + ")", null);
Ноумен

4
Це також буде працювати у випадку перегляду. PRAGMA table_info (View_Name); У цьому списку будуть перераховані всі стовпці виду

чому б просто не дотримуватися "limit 0" на кінці оператора select? int cols = sqlite3_column_count (stmt); fprintf (stdout, "% d стовпців \ n", cols); for (int i = 0; i <cols; i ++) fprintf (stdout, "% d.% s \ n", i, sqlite3_column_name (stmt, i));
Ерік Аронесті

@ErikAronesty limit 0 не повертає жодних стовпців.
Вільям Ентрікен

213

Якщо у вас є база даних sqlite, використовуйте програму командного рядка sqlite3 і ці команди:

Щоб перерахувати всі таблиці в базі даних:

.tables

Щоб показати схему для заданого tablename:

.schema tablename

8
Хоча результат не такий "читабельний" (можливо), це is_much_ простіше запам’ятати, ніжPRAGMA table_info(table_name);
Нік Томлін,

8
@NickTomlin На жаль, для цього методу потрібно мати програму командного рядка sqlite3, оскільки командні точки не є дійсними SQL.
Майкл

188

Якщо ти зробиш

.headers ON

ви отримаєте бажаний результат.


3
як вирівняти заголовки із вмістом нижче?
Сонячний день

6
І щоб завжди це було ввімкнено, покладіть його у свій .sqlitercфайл .
ruffin

Чи має це працювати з порожнім столом? Я досі не бачу назв стовпців
Крістофер Піс

З якихось причин я не знаю, і PRAGMAметод, і .schemaметод не працювали для мене. Але це працює чудово.
користувач3768495

114

Тільки для супер-нобусів, як я, цікаво, як і що люди мають на увазі

PRAGMA table_info('table_name') 

Ви хочете використовувати це як свою підготовку, як показано нижче. При цьому вибирається таблиця, яка виглядає приблизно так, за винятком заповнення значень, що відносяться до вашої таблиці.

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

Де id та ім’я - фактичні назви ваших стовпців. Отже, щоб отримати це значення, потрібно вибрати ім'я стовпця, використовуючи:

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

Яке поверне назву стовпця поточного рядка. Щоб схопити їх усіх або знайти потрібний, вам потрібно перебрати всі рядки. Найпростіший спосіб зробити це було б у наведеному нижче способі.

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

Якщо ви хочете, щоб вихід ваших запитів містив назви стовпців і правильно вирівнювався як стовпці, використовуйте ці команди в sqlite3:

.headers on
.mode column

Ви отримаєте вихід, як:

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

18

Щоб отримати список стовпців, ви можете просто скористатися:

.schema tablename

3
Це не відображатиме стовпці, додані з твердженням ALTER.
RajeshM

14

Альтернативний спосіб отримати список імен стовпців, які не згадані тут, - це вибрати з функції прагми:

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

Ви можете перевірити, чи існує певний стовпець, запустивши:

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

Це те, що ви використовуєте, якщо ви не хочете аналізувати результат вибору sql від sqlite_master або pragma table_info.

Довідка:

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


Приємний чистий підхід. І я до цього не знав функцій PRAGMA. Дякую.
Фахім Mitha

12

ви можете використовувати оператор Like, якщо шукаєте якийсь конкретний стовпець

колишній:

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

12

Коли ви запускаєте sqlite3кліп, вводите:

sqlite3 -header

також дасть бажаний результат


7

Я знаю, що це стара нитка, але останнім часом мені потрібно було те саме і я знайшов акуратний спосіб:

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

1
Ви мали на увазі:where t.name = 'table';
Luuk

ти знайшов акуратний шлях з моєї відповіді? 😂
користувач1461607

6

Для отримання інформації стовпця ви можете скористатися таким фрагментом:

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

це працює з переглядами, приєднується тощо. - але що це оболонка db?
Ерік Аронесті

Це просто jdbc. Без обгортки
Деволус

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 в sqlite консолі, коли ти знаходишся всередині таблиці, для мене це виглядає приблизно так ...

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

Я знаю, що вже пізно, але це допоможе іншим.

Щоб знайти ім'я стовпця таблиці, слід виконати, select * from tbl_nameі ви отримаєте результат у sqlite3_stmt *. і перевірте ітерацію стовпця над загальним отриманим стовпцем. Будь ласка, зверніться до наступного коду для того ж.

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

Це надрукує всі назви стовпців набору результатів.


2

.schema table_name

У цьому списку буде вказано назви стовпців таблиці з бази даних.

Сподіваюся, це допоможе !!!


0

Можливо, ви просто хочете роздрукувати заголовки таблиць на консолі. Це мій код: (для кожної таблиці)

    // ------------------ 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 ---------------------
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.