วิธีรับรายการชื่อคอลัมน์ในฐานข้อมูล Sqlite3


373

ฉันต้องการย้ายแอพ iPhone ไปยังฐานข้อมูลเวอร์ชันใหม่ เนื่องจากฉันไม่ได้บันทึกบางเวอร์ชันฉันต้องตรวจสอบว่ามีชื่อคอลัมน์บางชื่ออยู่

รายการ Stackoverflowนี้แนะนำให้ทำการเลือก

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

และแยกวิเคราะห์ผลลัพธ์

นั่นเป็นวิธีทั่วไปใช่ไหม ทางเลือก?


สำหรับกรณีเฉพาะของSQLite.swiftให้ดูคำถามและคำตอบนี้สำหรับรายการชื่อคอลัมน์แบบง่ายหรือชื่อนี้สำหรับปัญหาการย้ายข้อมูล
Suragch

เป็นไปได้ที่ซ้ำกันของวิธีรับรายชื่อคอลัมน์
Owen Pauling

คำตอบ:


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

เพียงแค่ใส่สิ่งนี้ลงในข้อกำหนดของโค้ดสำหรับ SQLiteDatabase บน Android เขียนdb.rawQuery("PRAGMA table_info(" + tablename + ")", null);
Noumenon

4
สิ่งนี้จะทำงานในกรณีของมุมมอง PRAGMA table_info (View_Name); นี่จะแสดงรายการคอลัมน์ทั้งหมดของมุมมอง

ทำไมไม่เพียงแค่ติด "จำกัด 0" ที่ส่วนท้ายของคำสั่งที่เลือก? int cols = sqlite3_column_count (stmt); fprintf (stdout, "% d คอลัมน์ \ n", cols); สำหรับ (int i = 0; i <cols; i ++) fprintf (stdout, "% d.% s \ n", i, sqlite3_column_name (stmt, i));
Erik Aronesty

@ErikAronesty limit 0 ไม่ส่งคืนคอลัมน์ใด ๆ
William Entriken

213

หากคุณมีฐานข้อมูล sqlite ให้ใช้โปรแกรมบรรทัดคำสั่ง sqlite3 และคำสั่งเหล่านี้:

ในการแสดงรายการตารางทั้งหมดในฐานข้อมูล:

.tables

วิธีแสดงสคีมาสำหรับสิ่งที่ได้รับtablename:

.schema tablename

8
แม้ว่าผลลัพธ์จะไม่เป็น "อ่านได้" (อาจ) นี่ is_much_ ง่ายต่อการจดจำกว่าPRAGMA table_info(table_name);
Nick Tomlin

8
@NickTomlin น่าเสียดายที่วิธีนี้ต้องใช้โปรแกรมบรรทัดคำสั่ง sqlite3 เนื่องจากคำสั่ง dot ไม่ใช่ SQL ที่ถูกต้อง
Michael

188

ถ้าคุณทำ

.headers ON

คุณจะได้รับผลลัพธ์ที่ต้องการ


3
วิธีจัดแนวส่วนหัวกับเนื้อหาด้านล่าง
Sunnyday

6
และมักจะมีว่าเมื่อวันที่ใส่ไว้ในของคุณ.sqlitercไฟล์
ruffin

ควรใช้กับตารางที่ว่างเปล่าได้ไหม ฉันยังไม่เห็นชื่อคอลัมน์
Christopher Pisz

ด้วยเหตุผลบางอย่างที่ฉันไม่รู้PRAGMAวิธีและ.schemaวิธีการทั้งสองไม่ได้ผลสำหรับฉัน แต่อันนี้ใช้ได้ดี
user3768495

114

เพียงเพื่อ noobs super อย่างฉันสงสัยว่าหรือสิ่งที่ผู้คนหมายถึงโดย

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

อีกทางเลือกหนึ่งในการรับรายการชื่อคอลัมน์ที่ไม่ได้กล่าวถึงที่นี่คือการเลือกจากฟังก์ชัน 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

นี่คือสิ่งที่คุณใช้ถ้าคุณไม่ต้องการแยกผลลัพธ์ของ select sql จาก sqlite_master หรือ pragma table_info

อ้างอิง:

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


วิธีทำความสะอาดที่ดี และฉันไม่รู้เกี่ยวกับฟังก์ชั่น PRAGMA ก่อนหน้านี้ ขอบคุณ.
Faheem Mitha

12

คุณสามารถใช้คำสั่ง Like หากคุณกำลังค้นหาคอลัมน์ใด ๆ

อดีต:

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';
Luuk

คุณพบวิธีที่เรียบร้อยจากคำตอบของฉันหรือไม่? 😂
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);
}

มันใช้งานได้กับ views, joins, และอื่น ๆ - แต่ wrapper 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

. schema ใน sqlite console เมื่อคุณมีคุณอยู่ในตารางมันมีลักษณะเช่นนี้สำหรับฉัน ...

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

สิ่งนี้จะพิมพ์ชื่อคอลัมน์ทั้งหมดของชุดผลลัพธ์



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.