স্ক্লাইট 3 ডাটাবেসে কলামের নামের তালিকা পাবেন কীভাবে?


373

আমি আমার আইফোন অ্যাপ্লিকেশনটিকে একটি নতুন ডাটাবেস সংস্করণে স্থানান্তর করতে চাই। যেহেতু আমার কাছে কিছু সংস্করণ সংরক্ষিত নেই, তাই আমাকে কিছু কলামের নাম বিদ্যমান আছে কিনা তা খতিয়ে দেখা উচিত।

এই স্ট্যাকওভারফ্লো এন্ট্রিটি নির্বাচনটি করার পরামর্শ দেয়

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
জেসন

এটিকে অ্যান্ড্রয়েডে এসকিউএলডেটাবেস-এর কোড শর্তে রাখতে, লিখুনdb.rawQuery("PRAGMA table_info(" + tablename + ")", null);
নওমেনন

4
এটি ভিউয়ের ক্ষেত্রেও কাজ করবে। PRAGMA টেবিল_ইনফো (দেখুন_নাম); এটি একটি

কেন একটি নির্বাচনী বিবৃতি শেষে কেবল "সীমা 0" স্টিক না? ইন্ট কোলস = স্ক্লাইট 3_ক্যালোম_কাউন্ট (স্টেমিট); fprintf (stdout, "% d কলাম \ n", কলস); (int i = 0; i <cols; i ++) fprintf (stdout, "% d।% s \ n", i, sqlite3_column_name (stmt, i)) এর জন্য;
এরিক অ্যারোনস্টি 20'15

@ এরিক অ্যারোনস্টি সীমা 0 কোনও কলাম দেয় না।
উইলিয়াম এন্টারিকেন

213

আপনার যদি স্ক্লাইট ডাটাবেস থাকে তবে sqlite3 কমান্ড লাইন প্রোগ্রাম এবং এই আদেশগুলি ব্যবহার করুন:

ডাটাবেসে সমস্ত সারণী তালিকাবদ্ধ করতে:

.tables

প্রদত্তের জন্য স্কিমা প্রদর্শন করতে tablename:

.schema tablename

8
যদিও আউটপুটটি "পঠনযোগ্য" হিসাবে নয় (সম্ভবত) এর চেয়ে বেশি মনে রাখা সহজPRAGMA table_info(table_name);
নিক টমলিন

8
@ নিকটমলিন দুর্ভাগ্যক্রমে, এই পদ্ধতিটির জন্য sqlite3 কমান্ড লাইন প্রোগ্রাম থাকা দরকার, কারণ ডট কমান্ডগুলি বৈধ এসকিউএল নয়।
মাইকেল

188

যদি তুমি করো

.headers ON

আপনি পছন্দসই ফলাফল পাবেন।


3
কিভাবে নীচের বিষয়বস্তু দিয়ে শিরোনাম সারিবদ্ধ?
সানডে

6
এবং সর্বদা এটি চালু রাখতে, এটি আপনার .sqlitercফাইলে রাখুন
রাফিন

এই খালি টেবিল দিয়ে কাজ করা উচিত? আমি এখনও কলামের নামগুলি দেখছি না
ক্রিস্টোফার পিজ্জ

কিছু কারণে আমি জানি না, 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

যেখানে আইডি এবং নাম আপনার কলামগুলির প্রকৃত নাম। সুতরাং এই মানটি পেতে আপনার ব্যবহার করে কলামের নাম নির্বাচন করতে হবে:

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


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

আপনি যদি স্ক্লাইট_মাস্টার বা প্রগমা টেবিল_ইনফো থেকে নির্বাচিত এসকিএল ফলাফলের বিশ্লেষণ করতে না চান তবে আপনি এটি ব্যবহার করেন।

রেফারেন্স:

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


সুন্দর পরিষ্কার পদ্ধতির। এবং এর আগে আমি PRAGMA ফাংশন সম্পর্কে জানতাম না। ধন্যবাদ.
ফাহিম মিঠা

12

আপনি যদি কোনও নির্দিষ্ট কলাম অনুসন্ধান করে থাকেন তবে আপনি লাইক স্টেটমেন্টটি ব্যবহার করতে পারেন

উদা:

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';
অর্থটি ছিল

আপনি আমার উত্তর থেকে ঝরঝরে পথ খুঁজে পেয়েছেন? 😂
ব্যবহারকারী 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);
}

এটি মতামত, যোগদান ইত্যাদির সাথে কাজ করে - তবে এটি কোন ডিবি র‌্যাপার?
এরিক আরোনস্টি

এটি কেবল জেডিবিসি। কোনও মোড়ক নেই।
ডিভোলাস

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 আপনি যখন টেবিলের অভ্যন্তরে থাকবেন তখন আমার কাছে এমন কিছু দেখাচ্ছে looks

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.