我想将我的iPhone应用迁移到新的数据库版本。因为我没有保存某些版本,所以我需要检查某些列名是否存在。
这个Stackoverflow条目建议执行选择操作。
SELECT sql FROM sqlite_master
WHERE tbl_name = 'table_name' AND type = 'table'
并解析结果。
这是常见的方法吗?还有其他替代方案吗?
我想将我的iPhone应用迁移到新的数据库版本。因为我没有保存某些版本,所以我需要检查某些列名是否存在。
这个Stackoverflow条目建议执行选择操作。
SELECT sql FROM sqlite_master
WHERE tbl_name = 'table_name' AND type = 'table'
并解析结果。
这是常见的方法吗?还有其他替代方案吗?
PRAGMA table_info(table_name);
这将为您提供所有列名的列表。
创建临时表TmpCols(cid整数,名称文本,类型文本,nn位,dflt_value,pk位);
.mode插入TmpCols
.output cols
PRAGMA TABLE_INFO('yourtable');
.read cols
.mode csv
.output stdout
- Jasondb.rawQuery("PRAGMA table_info(" + tablename + ")", null);
。 - Noumenon如果您执行
.headers ON
你将会获得期望的结果。
PRAGMA
方法和.schema
方法都不能正常工作。但是这个方法可以完美地解决问题。 - user3768495.headers on
和 .mode columns
命令可以打开列名并对齐所有内容。 - brother-bilo.tables
显示给定tablename
的模式:
.schema tablename
PRAGMA table_info(table_name);
更容易记忆。 - Nick Tomlin只是为了像我这样的超级新手想知道人们如何或者什么意思
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
}
}
sqlite3
(或者你的命名方式)进入 sqlite CLI,然后输入那段文本。不需要为此编写大量代码 :) - xerufsqlite3
即可。此外,@birdbuster,指定您正在使用的语言和库会有所帮助。从sprintf
函数来看,它看起来像C++。澄清这一点很有帮助,因为OP问题是与语言无关的。 - Mike Williamson如果希望查询结果包含列名并且正确排列成列,请在 sqlite3
中使用以下命令:
.headers on
.mode column
您将会得到如下输出:
sqlite> .headers on
sqlite> .mode column
sqlite> select * from mytable;
id foo bar
---------- ---------- ----------
1 val1 val2
2 val3 val4
~/.sqliterc
中。 - Daniel Lidström获取列名列表的另一种方法,可以跨平台,并且不依赖于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)中添加。
参考:
pragma_table_info('table', 'schema')
就会起作用。 - undefined获取列的列表,您可以简单地使用:
.schema tablename
我知道这是一个老帖子,但最近我需要同样的东西,并找到了一个好方法:
SELECT c.name FROM pragma_table_info('your_table_name') c;
where t.name = 'table';
。 - Luuk当您运行 sqlite3
命令行工具时,键入:
sqlite3 -header
也会产生期望的结果
.schema table_name
这将列出来自数据库的表的列名。
希望这会有所帮助!!!
SQLite.swift
的特定情况,请参见此问题和答案,以获取列名的简单列表,或者参见此问题以解决迁移问题。 - Suragch