如何在sqlite3/iPhone上获取列名列表?

lue*_*ken 330 sqlite iphone

我想将我的iPhone应用程序迁移到新的数据库版本.由于我没有保存某些版本,我需要检查是否存在某些列名.

Stackoverflow条目建议执行select

SELECT sql FROM sqlite_master
WHERE tbl_name = 'table_name' AND type = 'table'
Run Code Online (Sandbox Code Playgroud)

并解析结果.

这是常见的方式吗?备择方案?

nev*_*ing 539

PRAGMA table_info(table_name);
Run Code Online (Sandbox Code Playgroud)

将为您提供所有列名称的列表.

  • 但你不能从那张桌子中选择.这简直太烦人了.我正在尝试这样的东西...但它不起作用`创建临时表TmpCols(cid整数,名称文本,类型文本,nn位,dflt_value,pk位); .mode insert TmpCols .output cols PRAGMA TABLE_INFO('yourtable'); .read cols .mode csv .output stdout` (18认同)
  • 要作为查询执行,请参阅@user1461607的[答案](/sf/answers/3847399741/):`select * from pragma_table_info('tblName') as tblInfo;` (17认同)
  • 这也适用于View.PRAGMA table_info(View_Name); 这将列出视图的所有列 (4认同)

小智 195

如果您有sqlite数据库,请使用sqlite3命令行程序和以下命令:

列出数据库中的所有表:

.tables
Run Code Online (Sandbox Code Playgroud)

要显示给定的架构tablename:

.schema tablename
Run Code Online (Sandbox Code Playgroud)

  • @NickTomlin不幸的是,这个方法需要使用sqlite3命令行程序,因为dot命令不是有效的SQL. (8认同)
  • 虽然输出不是"可读"(也许),但这比`PRAGMA table_info(table_name)更容易记住; (7认同)

小智 168

如果你这样做

.headers ON
Run Code Online (Sandbox Code Playgroud)

你会得到理想的结果.

  • `.headers on` 和 `.mode columns` 将打开列名称并对齐所有内容 (21认同)
  • 并始终将其打开,将其放入[你的`.sqliterc`文件](/sf/answers/414702081/). (4认同)
  • 如何将标题与下面的内容对齐? (3认同)
  • 这应该适用于空表吗?我仍然没有看到列名称 (2认同)

Bir*_*ter 107

只为像我这样的超级新人想知道人们的意思或方式

PRAGMA table_info('table_name') 
Run Code Online (Sandbox Code Playgroud)

您想使用它作为您的准备语句,如下所示.这样做会选择一个看起来像这样的表,除了填充了与您的表有关的值.

cid         name        type        notnull     dflt_value  pk        
----------  ----------  ----------  ----------  ----------  ----------
0           id          integer     99                      1         
1           name                    0                       0
Run Code Online (Sandbox Code Playgroud)

其中id和name是列的实际名称.因此,要获得该值,您需要使用以下选项来选择列名:

//returns the name
sqlite3_column_text(stmt, 1);
//returns the type
sqlite3_column_text(stmt, 2);
Run Code Online (Sandbox Code Playgroud)

这将返回当前行的列名称.要抓住它们或找到你想要的那个,你需要迭代所有的行.最简单的方法是采用以下方式.

//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
    }
}
Run Code Online (Sandbox Code Playgroud)


Owe*_*ing 35

如果希望查询的输出包含列名并正确对齐为列,请在sqlite3以下位置使用以下命令:

.headers on
.mode column
Run Code Online (Sandbox Code Playgroud)

您将获得如下输出:

sqlite> .headers on
sqlite> .mode column
sqlite> select * from mytable;
id          foo         bar
----------  ----------  ----------
1           val1        val2
2           val3        val4
Run Code Online (Sandbox Code Playgroud)

  • 并将它们放入`~/.sqliterc`中。 (3认同)

小智 15

我知道这是一个旧线程,但最近我需要相同的线程并找到了一个巧妙的方法:

SELECT c.name FROM pragma_table_info('your_table_name') c;
Run Code Online (Sandbox Code Playgroud)

  • 您从我的回答中找到了巧妙的方法吗? (2认同)

小智 12

下面的这些命令可以设置列名称:

\n
.headers on\n
Run Code Online (Sandbox Code Playgroud)\n
.header on\n
Run Code Online (Sandbox Code Playgroud)\n

然后,您可以得到列名的结果,如下所示:

\n
sqlite> SELECT * FROM user;\nid|first_name|last_name|age\n1|Steve|Jobs|56\n2|Bill|Gates|66\n3|Mark|Zuckerberg|38\n
Run Code Online (Sandbox Code Playgroud)\n

并且,下面的这些命令可以取消设置列名称:

\n
.headers off\n
Run Code Online (Sandbox Code Playgroud)\n
.header off\n
Run Code Online (Sandbox Code Playgroud)\n

然后,您可以获得不带列名的结果,如下所示:

\n
sqlite> SELECT * FROM user;\n1|Steve|Jobs|56\n2|Bill|Gates|66\n3|Mark|Zuckerberg|38\n
Run Code Online (Sandbox Code Playgroud)\n

并且,下面的这些命令可以显示命令的详细信息.headers

\n
.help .headers\n
Run Code Online (Sandbox Code Playgroud)\n
.help .header\n
Run Code Online (Sandbox Code Playgroud)\n
.help headers\n
Run Code Online (Sandbox Code Playgroud)\n
.help header\n
Run Code Online (Sandbox Code Playgroud)\n

然后,您可以显示命令的详细信息.headers,如下所示:

\n
sqlite> .help .headers\n.headers on|off          Turn display of headers on or off\n
Run Code Online (Sandbox Code Playgroud)\n

另外,下面的命令可以设置输出模式box

\n
.mode box\n
Run Code Online (Sandbox Code Playgroud)\n

然后,您可以设置输出模式,box如下所示:

\n
sqlite> SELECT * FROM user;\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 id \xe2\x94\x82 first_name \xe2\x94\x82 last_name  \xe2\x94\x82 age \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 1  \xe2\x94\x82 Steve      \xe2\x94\x82 Jobs       \xe2\x94\x82 56  \xe2\x94\x82\n\xe2\x94\x82 2  \xe2\x94\x82 Bill       \xe2\x94\x82 Gates      \xe2\x94\x82 66  \xe2\x94\x82\n\xe2\x94\x82 3  \xe2\x94\x82 Mark       \xe2\x94\x82 Zuckerberg \xe2\x94\x82 38  \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n

并且,下面的命令设置输出模式table

\n
.mode table\n
Run Code Online (Sandbox Code Playgroud)\n

然后,您可以设置输出模式,table如下所示:

\n
sqlite> SELECT * FROM user;\n+----+------------+------------+-----+\n| id | first_name | last_name  | age |\n+----+------------+------------+-----+\n| 1  | Steve      | Jobs       | 56  |\n| 2  | Bill       | Gates      | 66  |\n| 3  | Mark       | Zuckerberg | 38  |\n+----+------------+------------+-----+\n
Run Code Online (Sandbox Code Playgroud)\n

并且,这些命令可以显示命令的详细信息.mode

\n
.help .mode\n
Run Code Online (Sandbox Code Playgroud)\n
.help mode\n
Run Code Online (Sandbox Code Playgroud)\n
.help mode\n
Run Code Online (Sandbox Code Playgroud)\n

然后,您可以显示命令的详细信息.mode

\n
.help modes\n
Run Code Online (Sandbox Code Playgroud)\n

最后,您可以显示命令.headers.mode.help如下所示:

\n
sqlite> .help .mode\n.import FILE TABLE       Import data from FILE into TABLE\n   Options:\n     --ascii               Use \\037 and \\036 as column and row separators\n     --csv                 Use , and \\n as column and row separators\n     --skip N              Skip the first N rows of input\n     --schema S            Target table to be S.TABLE\n     -v                    "Verbose" - increase auxiliary output\n   Notes:\n     *  If TABLE does not exist, it is created.  The first row of input\n        determines the column names.\n     *  If neither --csv or --ascii are used, the input mode is derived\n        from the ".mode" output mode\n     *  If FILE begins with "|" then it is a command that generates the\n        input text.\n.mode MODE ?OPTIONS?     Set output mode\n   MODE is one of:\n     ascii       Columns/rows delimited by 0x1F and 0x1E\n     box         Tables using unicode box-drawing characters\n     csv         Comma-separated values\n     column      Output in columns.  (See .width)\n     html        HTML <table> code\n     insert      SQL insert statements for TABLE\n     json        Results in a JSON array\n     line        One value per line\n     list        Values delimited by "|"\n     markdown    Markdown table format\n     qbox        Shorthand for "box --width 60 --quote"\n     quote       Escape answers as for SQL\n     table       ASCII-art table\n     tabs        Tab-separated values\n     tcl         TCL list elements\n   OPTIONS: (for columnar modes or insert mode):\n     --wrap N       Wrap output lines to no longer than N characters\n     --wordwrap B   Wrap or not at word boundaries per B (on/off)\n     --ww           Shorthand for "--wordwrap 1"\n     --quote        Quote output text as SQL literals\n     --noquote      Do not quote output text\n     TABLE          The name of SQL table used for "insert" mode\n
Run Code Online (Sandbox Code Playgroud)\n


小智 11

如果要搜索任何特定列,可以使用Like语句

例如:

SELECT * FROM sqlite_master where sql like('%LAST%')
Run Code Online (Sandbox Code Playgroud)


小智 11

.schema table_name

这将列出数据库中表的列名。

希望这会有所帮助!!!


Sam*_*ton 10

当您运行sqlite3cli时,键入:

sqlite3 -header
Run Code Online (Sandbox Code Playgroud)

也会给出理想的结果


Que*_*tin 10

这是一个老问题,但这里有一个替代答案,它检索 SQLite 数据库中的所有列,以及每列关联表的名称:

WITH tables AS (SELECT name tableName, sql 
FROM sqlite_master WHERE type = 'table' AND tableName NOT LIKE 'sqlite_%')
SELECT fields.name, fields.type, tableName
FROM tables CROSS JOIN pragma_table_info(tables.tableName) fields
Run Code Online (Sandbox Code Playgroud)

这将返回这种类型的结果:

{
    "name": "id",
    "type": "integer",
    "tableName": "examples"
}, {
    "name": "content",
    "type": "text",
    "tableName": "examples"
}
Run Code Online (Sandbox Code Playgroud)

对于包含标识符和字符串内容的简单表。


Adi*_*dar 8

要获取列列表,您可以简单地使用:

.schema tablename
Run Code Online (Sandbox Code Playgroud)

  • 这不会显示使用 ALTER 语句添加的列。 (5认同)

Dev*_*lus 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);
}
Run Code Online (Sandbox Code Playgroud)

  • jdbc 是一个包装器;) (2认同)

Dat*_*kar 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;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

.schema 在 sqlite 控制台中,当你在桌子里面时,它对我来说看起来像这样......

sqlite>.schema
CREATE TABLE players(
id integer primary key,
Name varchar(255),
Number INT,
Team varchar(255)
Run Code Online (Sandbox Code Playgroud)


use*_*607 5

获取此处未提及的列名列表的另一种方法是从编译指示函数中进行选择:

SELECT name FROM PRAGMA_TABLE_INFO('your_table');
name      
tbl_name  
rootpage  
sql
Run Code Online (Sandbox Code Playgroud)

您可以通过运行以下命令检查某个列是否存在:

SELECT 1 FROM PRAGMA_TABLE_INFO('your_table') WHERE name='sql';
1
Run Code Online (Sandbox Code Playgroud)

如果不想解析来自sqlite_master或pragma table_info的select sql的结果,则使用此方法。

参考:

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

  • 漂亮干净的方法。在此之前我不知道 PRAGMA 函数。谢谢你。 (3认同)