如何在Sqlite3数据库中获取列名列表?

582

我想将我的iPhone应用迁移到新的数据库版本。因为我没有保存某些版本,所以我需要检查某些列名是否存在。

这个Stackoverflow条目建议执行选择操作。

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

并解析结果。

这是常见的方法吗?还有其他替代方案吗?


对于 SQLite.swift 的特定情况,请参见此问题和答案,以获取列名的简单列表,或者参见此问题以解决迁移问题。 - Suragch
可能是如何获取列名列表的重复内容。 - Owen Pauling
25个回答

820
PRAGMA table_info(table_name);

这将为您提供所有列名的列表。


27
但是你无法从那个表中进行选择,这非常令人讨厌。我正在尝试像这样做...但它不起作用:创建临时表TmpCols(cid整数,名称文本,类型文本,nn位,dflt_value,pk位); .mode插入TmpCols .output cols PRAGMA TABLE_INFO('yourtable'); .read cols .mode csv .output stdout - Jason
为了在Android上使用SQLiteDatabase,将其转化为代码,写入 db.rawQuery("PRAGMA table_info(" + tablename + ")", null); - Noumenon
6
这个方法同样适用于View。PRAGMA table_info(View_Name); 这会列出View的所有列。 - user1032317
1
为什么它被称为Pragma?这不是用于黑客编译器的吗?它在这里做什么啊,哈哈? - rassa45
15
要将其作为查询执行,请参见@user1461607的答案select * from pragma_table_info('tblName') as tblInfo; - mdisibio
显示剩余4条评论

338

如果您执行

.headers ON

你将会获得期望的结果。


6
如何使标题与下面的内容对齐? - eastwater
21
为了始终保持它的开启状态,请将其放入您的.sqliterc文件中。 - ruffin
2
这个能在空表格中工作吗?我仍然看不到列名。 - Christopher Pisz
由于某些我不知道的原因,PRAGMA方法和.schema方法都不能正常工作。但是这个方法可以完美地解决问题。 - user3768495
18
.headers on.mode columns 命令可以打开列名并对齐所有内容。 - brother-bilo
@Sunnyday,请查看brother-bilo的评论,执行两个命令,然后运行你的查询。 - Shadman Akhtar

304
如果你有sqlite数据库,请使用sqlite3命令行程序和以下命令: 列出数据库中所有的表:
.tables
显示给定tablename的模式:
.schema tablename

11
虽然输出结果可能不太容易理解,但这条命令比 PRAGMA table_info(table_name); 更容易记忆。 - Nick Tomlin
15
很遗憾,这种方法需要拥有sqlite3命令行程序,因为点命令不是有效的SQL语句。 - Michael

146

只是为了像我这样的超级新手想知道人们如何或者什么意思

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

1
他们的意思是执行 sqlite3(或者你的命名方式)进入 sqlite CLI,然后输入那段文本。不需要为此编写大量代码 :) - xeruf
是的,正如@Xerus所说...不需要大量的代码。直接使用sqlite3即可。此外,@birdbuster,指定您正在使用的语言和库会有所帮助。从sprintf函数来看,它看起来像C++。澄清这一点很有帮助,因为OP问题是与语言无关的。 - Mike Williamson

125

如果希望查询结果包含列名并且正确排列成列,请在 sqlite3 中使用以下命令:

.headers on
.mode column

您将会得到如下输出:

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

2
把它们放在 ~/.sqliterc 中。 - Daniel Lidström
所有终端命令,没有SQL。 - Ash

77

获取列名列表的另一种方法,可以跨平台,并且不依赖于sqlite3.exe shell,是从PRAGMA_TABLE_INFO()表值函数中进行选择。

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

您可以通过以下查询来检查特定列是否存在:

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

如果你不想解析select sql from sqlite_master或pragma table_info的结果,可以使用这个。

请注意,此功能是实验性的,并在SQLite版本3.16.0(2017-01-02)中添加。

参考:

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


1
这仅适用于本地数据库。如果您尝试使用附加的模式进行操作,它将无法正常工作。 - Jinghui Niu
@JinghuiNiu 如果你将模式作为第二个参数传递进去,pragma_table_info('table', 'schema') 就会起作用。 - undefined

39

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

.schema tablename

6
这不会显示使用ALTER语句添加的列。 - RajeshM

24

我知道这是一个老帖子,但最近我需要同样的东西,并找到了一个好方法:

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

1
您的意思是:where t.name = 'table'; - Luuk
5
你从我的回答中找到了简洁明了的方法吗? - user1461607

21

当您运行 sqlite3 命令行工具时,键入:

sqlite3 -header

也会产生期望的结果


弱的答案。这是一个CLI命令。预期的是SQL查询。 - Ash

14

.schema table_name

这将列出来自数据库的表的列名。

希望这会有所帮助!!!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,