Làm thế nào để có được một danh sách các tên cột trên cơ sở dữ liệu Sqlite3?


373

Tôi muốn chuyển ứng dụng iPhone của mình sang phiên bản cơ sở dữ liệu mới. Vì tôi không có một số phiên bản được lưu, tôi cần kiểm tra xem các tên cột nhất định có tồn tại không.

Mục Stackoverflow này đề nghị thực hiện chọn

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

và phân tích kết quả.

Đó có phải là cách phổ biến? Lựa chọn thay thế?


Đối với trường hợp cụ thể SQLite.swift, hãy xem câu hỏi và câu trả lời này để biết danh sách tên cột đơn giản hoặc tên này cho các vấn đề di chuyển.
Suragch

Bản sao có thể có của Cách nhận danh sách tên cột
Owen Pauling

Câu trả lời:


586
PRAGMA table_info(table_name);

sẽ giúp bạn có một danh sách tất cả các tên cột.


19
nhưng bạn không thể chọn từ bảng đó. Nó chỉ đơn giản là gây phiền nhiễu. Tôi đang thử một cái gì đó như thế này ... nhưng nó không hoạt độngcreate 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

Chỉ cần đặt điều này vào các thuật ngữ mã cho SQLiteDatabase trên Android, hãy viếtdb.rawQuery("PRAGMA table_info(" + tablename + ")", null);
Noumenon

4
Điều này cũng sẽ hoạt động trong trường hợp của View. PRAGMA bảng_info (View_Name); Điều này sẽ liệt kê tất cả các cột của Chế độ xem

tại sao không chỉ dán "giới hạn 0" vào cuối câu lệnh chọn? int cols = sqlite3_column_count (stmt); fprintf (stdout, "% d cột \ n", cols); for (int i = 0; i <cols; i ++) fprintf (stdout, "% d.% s \ n", i, sqlite3_column_name (stmt, i));
Erik Aronesty

@ErikAronesty giới hạn 0 không trả về bất kỳ cột nào.
William Entriken

213

Nếu bạn có cơ sở dữ liệu sqlite, hãy sử dụng chương trình dòng lệnh sqlite3 và các lệnh sau:

Để liệt kê tất cả các bảng trong cơ sở dữ liệu:

.tables

Để hiển thị lược đồ cho trước tablename:

.schema tablename

8
Mặc dù đầu ra không phải là "có thể đọc được" (có lẽ) nhưng điều này dễ nhớ hơnPRAGMA table_info(table_name);
Nick Tomlin

8
@NickTomlin Thật không may, phương pháp này yêu cầu phải có chương trình dòng lệnh sqlite3, vì các lệnh dot không phải là SQL hợp lệ.
Michael

188

Nếu bạn làm

.headers ON

bạn sẽ nhận được kết quả mong muốn.


3
Làm thế nào để sắp xếp các tiêu đề với nội dung dưới đây?
Sunnyday

6
Và để luôn luôn có nó, đặt nó trong tập tin của bạn.sqliterc .
ruffin

Điều này có nên làm việc với một bảng trống? Tôi vẫn không thấy tên cột
Christopher Pisz

Vì một số lý do tôi không biết, cả PRAGMAphương pháp và .schemaphương pháp đều không hiệu quả với tôi. Nhưng cái này hoạt động tốt.
dùng3768495

114

Chỉ dành cho những siêu nhân như tôi tự hỏi làm thế nào hoặc mọi người có ý gì

PRAGMA table_info('table_name') 

Bạn muốn sử dụng sử dụng như tuyên bố chuẩn bị của bạn như dưới đây. Làm như vậy sẽ chọn một bảng trông như thế này ngoại trừ được điền với các giá trị liên quan đến bảng của bạn.

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

Trong đó id và tên là tên thực tế của các cột của bạn. Vì vậy, để có được giá trị đó, bạn cần chọn tên cột bằng cách sử dụng:

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

Cái nào sẽ trả về tên của hàng hiện tại. Để lấy tất cả chúng hoặc tìm cái bạn muốn, bạn cần lặp qua tất cả các hàng. Cách đơn giản nhất để làm như vậy sẽ theo cách dưới đây.

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

Nếu bạn muốn đầu ra của các truy vấn của mình bao gồm tên cột và được căn chỉnh chính xác dưới dạng cột, hãy sử dụng các lệnh sau trong sqlite3:

.headers on
.mode column

Bạn sẽ nhận được đầu ra như:

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

18

Để có được danh sách các cột, bạn chỉ cần sử dụng:

.schema tablename

3
Điều này sẽ không hiển thị các cột được thêm bằng câu lệnh ALTER.
RajeshM

14

Một cách khác để có được danh sách các tên cột không được đề cập ở đây là chọn từ hàm pragma:

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

Bạn có thể kiểm tra nếu một cột nhất định tồn tại bằng cách chạy:

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

Đây là những gì bạn sử dụng nếu bạn không muốn phân tích kết quả của việc chọn sql từ sqlite_master hoặc pragma table_info.

Tài liệu tham khảo:

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


Cách tiếp cận sạch đẹp. Và tôi đã không biết về các chức năng PRAGMA trước đó. Cảm ơn bạn.
Faheem Mitha

12

bạn có thể sử dụng câu lệnh Like nếu bạn đang tìm kiếm bất kỳ cột cụ thể nào

Ví dụ:

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

12

Khi bạn chạy sqlite3cli, gõ vào:

sqlite3 -header

cũng sẽ cho kết quả mong muốn


7

Tôi biết đó là một chủ đề cũ, nhưng gần đây tôi cần điều tương tự và tìm thấy một cách gọn gàng:

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

1
Bạn đã có nghĩa là:where t.name = 'table';
Luuk

bạn đã tìm thấy cách gọn gàng từ câu trả lời của tôi? 😂
user1461607

6

Để có được thông tin cột, bạn có thể sử dụng đoạn mã sau:

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

cái này hoạt động với các khung nhìn, các phép nối, v.v. - nhưng trình bao bọc db này là gì?
Erik Aronesty

Nó chỉ đơn giản là jdbc. Không có giấy gói.
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 trong bảng điều khiển sqlite khi bạn có bạn ở trong bàn, nó trông giống như thế này đối với tôi ...

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

Tôi biết đã quá muộn nhưng điều này sẽ giúp người khác.

Để tìm tên cột của bảng, bạn nên thực hiện select * from tbl_namevà bạn sẽ nhận được kết quả sqlite3_stmt *. và kiểm tra cột lặp trên toàn bộ cột được tìm nạp. Vui lòng tham khảo mã sau đây cho cùng.

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

Điều này sẽ in tất cả các tên cột của tập kết quả.


2

.schema table_name

Điều này sẽ liệt kê các tên cột của bảng từ cơ sở dữ liệu.

Hy vọng điều này sẽ giúp !!!


0

Có lẽ bạn chỉ muốn in các tiêu đề bảng trên bàn điều khiển. Đây là mã của tôi: (cho mỗi bảng)

    // ------------------ 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 ---------------------
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.