如何获取列名列表

时间:2009-03-26 10:30:20

标签: sqlite

可以获得一个包含表的所有列名的行,如下所示:

|id|foo|bar|age|street|address|

我不喜欢使用Pragma table_info(bla)

11 个答案:

答案 0 :(得分:83)

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

然后使用Reg Exp(很容易)解析这个值,它看起来与此类似:[(.*?)]

或者您也可以使用:

PRAGMA table_info(table_name)

答案 1 :(得分:31)

如果在执行查询之前使用命令行shell到SQLite,那么.headers on。您只需在给定的会话中执行此操作一次。

答案 2 :(得分:6)

这有助于HTML5 SQLite:

tx.executeSql('SELECT name, sql FROM sqlite_master WHERE type="table" AND name = "your_table_name";', [], function (tx, results) {
  var columnParts = results.rows.item(0).sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').split(','); ///// RegEx
  var columnNames = [];
  for(i in columnParts) {
    if(typeof columnParts[i] === 'string')
      columnNames.push(columnParts[i].split(" ")[0]);
  }
  console.log(columnNames);
  ///// Your code which uses the columnNames;
});

您可以使用您的语言重用正则表达式来获取列名称。

更短的选择:

tx.executeSql('SELECT name, sql FROM sqlite_master WHERE type="table" AND name = "your_table_name";', [], function (tx, results) {
  var columnNames = results.rows.item(0).sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').replace(/ [^,]+/g, '').split(',');
  console.log(columnNames);
  ///// Your code which uses the columnNames;
});

答案 3 :(得分:2)

是的,您可以使用以下命令来实现:

sqlite> .headers on
sqlite> .mode column

表格上的选择结果将如下所示:

id          foo         bar         age         street      address
----------  ----------  ----------  ----------  ----------  ----------
1           val1        val2        val3        val4        val5
2           val6        val7        val8        val9        val10

答案 4 :(得分:2)

您可以在如下所示的sqlite中使用与编译指示相关的命令

pragma table_info("table_name")
--Alternatively
select * from pragma_table_info("table_name")

如果您需要诸如id|foo|bar|age|street|address之类的列名,那么基本上您的答案就在下面的查询中。

select group_concat(name,'|') from pragma_table_info("table_name")

答案 5 :(得分:1)

PHP中的查询结果集提供了几个允许这样的功能:

[alias]
    # Move forward/Backward
    fw = "!git log --pretty=oneline --all | grep -B1 `git rev-parse HEAD` | head -n1 | egrep -o '[a-f0-9]{20,}' | xargs git checkout"
    bw = "!git checkout HEAD~1"

实施例

    numCols() 
    columnName(int $column_number )

答案 6 :(得分:0)

$<?
$db = sqlite_open('mysqlitedb');
$cols = sqlite_fetch_column_types('form name'$db, SQLITE_ASSOC);
foreach ($cols as $column => $type) {
  echo "Column: $column  Type: $type\n";
}

答案 7 :(得分:0)

使用@Tarkus的答案,以下是我在R中使用的正则表达式:

getColNames <- function(conn, tableName) {
    x <- dbGetQuery( conn, paste0("SELECT sql FROM sqlite_master WHERE tbl_name = '",tableName,"' AND type = 'table'") )[1,1]
    x <- str_split(x,"\\n")[[1]][-1]
    x <- sub("[()]","",x)
    res <- gsub( '"',"",str_extract( x[1], '".+"' ) )
    x <- x[-1]
    x <- x[-length(x)]
    res <- c( res, gsub( "\\t", "", str_extract( x, "\\t[0-9a-zA-Z_]+" ) ) )
    res
}

代码有点草率,但似乎有效。

答案 8 :(得分:0)

试试这个sqlite表模式解析器,我实现了sqlite表解析器,用于解析PHP中的表定义。

它返回完整定义(唯一,主键,类型,精度,非空,引用,表约束......等)

https://github.com/maghead/sqlite-parser

答案 9 :(得分:0)

获取最近执行的SELECT的列名的最简单方法是使用游标的description属性。一个Python示例:

print_me = "("
for description in cursor.description:
    print_me += description[0] + ", "
print(print_me[0:-2] + ')')
# Example output: (inp, output, reason, cond_cnt, loop_likely)

答案 10 :(得分:0)

使用递归查询。给定

create table t (a int, b int, c int);

运行:

with recursive
  a (cid, name) as (select cid, name from pragma_table_info('t')),
  b (cid, name) as (
    select cid, '|' || name || '|' from a where cid = 0
    union all
    select a.cid, b.name || a.name || '|' from a join b on a.cid = b.cid + 1
  )
select name
from b
order by cid desc
limit 1;

或者,只需使用group_concat

select '|' || group_concat(name, '|') || '|' from pragma_table_info('t')

两者的产量:

|a|b|c|