Sqlite3 데이터베이스에서 열 이름 목록을 얻는 방법은 무엇입니까?


373

iPhone 앱을 새로운 데이터베이스 버전으로 마이그레이션하고 싶습니다. 버전을 저장하지 않았으므로 특정 열 이름이 있는지 확인해야합니다.

Stackoverflow 항목 은 선택을 제안합니다.

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

결과를 구문 분석하십시오.

이것이 일반적인 방법입니까? 대안?


의 구체적인 사례를 들어 SQLite.swift, 볼 이 질문에 대답 열 이름의 간단한 목록 또는 대한 이 하나의 마이그레이션 문제를.
Suragch

답변:


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
Jason

이것을 Android의 SQLiteDatabase에 대한 코드 용어로 작성하려면 다음과 같이 작성하십시오.db.rawQuery("PRAGMA table_info(" + tablename + ")", null);
Noumenon

4
이것은 View의 경우에도 작동합니다. PRAGMA table_info (뷰 _ 이름); 뷰의 모든 열이 나열됩니다.

왜 select 문 끝에 "limit 0"을 붙이지 않겠습니까? int cols = sqlite3_column_count (stmt); fprintf (stdout, "% d columns \ n", cols); for (int i = 0; i <cols; i ++) fprintf (stdout, "% d. % s \ n", i, sqlite3_column_name (stmt, i));
Erik Aronesty

@ErikAronesty 제한 0은 열을 반환하지 않습니다.
윌리엄 Entriken

213

sqlite 데이터베이스가있는 경우 sqlite3 명령 행 프로그램 및 다음 명령을 사용하십시오.

데이터베이스의 모든 테이블을 나열하려면 다음을 수행하십시오.

.tables

지정된 스키마를 표시하려면 다음을 수행하십시오 tablename.

.schema tablename

8
비록 출력이 "읽을 수있는"것은 아니지만 (아마도) 이것은 is_much_보다 기억하기 쉽다.PRAGMA table_info(table_name);
Nick Tomlin

8
@NickTomlin 불행하게도, 도트 명령은 유효한 SQL이 아니기 때문에이 메소드에는 sqlite3 명령 행 프로그램이 필요합니다.
Michael

188

당신이 할 경우

.headers ON

원하는 결과를 얻을 수 있습니다.


3
아래 내용과 헤더를 정렬하는 방법은 무엇입니까?
Sunnyday

6
그리고 항상에에에 그것을 넣어 가지고 당신의 .sqliterc파일 .
ruffin

빈 테이블에서 작동해야합니까? 그래도 열 이름이 보이지 않습니다.
Christopher Pisz

내가 모르는 이유 때문에, 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 문으로 추가 된 열은 표시되지 않습니다.
RajeshM

14

여기에 언급되지 않은 열 이름 목록을 얻는 다른 방법은 pragma 함수에서 선택하는 것입니다.

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

sqlite_master 또는 pragma table_info에서 select sql의 결과를 구문 분석하지 않으려는 경우 사용합니다.

참고:

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


깔끔한 접근 방식. 그리고 나는 전에 PRAGMA 기능을 알지 못했습니다. 감사합니다.
Faheem Mitha

12

특정 열을 검색하는 경우 Like 문을 사용할 수 있습니다

전의:

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

12

sqlite3cli 를 실행할 때 다음을 입력하십시오.

sqlite3 -header

또한 원하는 결과를 줄 것이다


7

나는 그것이 오래된 실이라는 것을 알고 있지만 최근에는 똑같은 것이 필요하고 깔끔한 방법을 찾았습니다.

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

1
당신은 한 평균 :where t.name = 'table';
루크

내 대답에서 깔끔한 방법을 찾았습니까? 😂
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);
}

이것은 뷰, 조인 등에서 작동합니다. 그러나 이것이 어떤 DB 래퍼입니까?
Erik Aronesty

단순히 jdbc입니다. 랩퍼가 없습니다.
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

당신이 테이블 안에있을 때 sqlite 콘솔의 .schema 그것은 나에게 이런 식으로 보입니다 ...

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 ---------------------
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.