Как получить список имен столбцов в базе данных 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);
Noumenon

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

почему бы просто не вставить "предел 0" в конце оператора выбора? int cols = sqlite3_column_count (stmt); fprintf (стандартный вывод, "% d столбцы \ n", столбцы); для (int i = 0; i <cols; i ++) fprintf (стандартный вывод, "% 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метод оба не работали для меня. Но этот работает просто отлично.
user3768495

114

Просто для супер нубов, как я, интересно, как или что люди подразумевают под

PRAGMA table_info('table_name') 

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

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

Где id и name - это фактические имена ваших столбцов. Таким образом, чтобы получить это значение, вам нужно выбрать имя столбца, используя:

//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.
РаджеМ

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 до этого. Спасибо.
Фахим Митха


12

Вы можете использовать лайк, если вы ищете какой-то конкретный столбец

например:

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

7

Я знаю, что это старая ветка, но недавно мне понадобилось то же самое, и я нашел изящный способ:

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

1
Вы имели в виду:where t.name = 'table';
Луук

Вы нашли аккуратный путь из моего ответа? User
user1461607

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

это работает с представлениями, объединениями и т. д. - но что это за оболочка БД?
Эрик Аронесты

Это просто 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.