如何获取列名称列表

问题描述 投票:0回答:12

是否可以像这样获取包含表的所有列名的行?

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

我不喜欢用

Pragma table_info(bla)

sqlite
12个回答
96
投票
SELECT sql FROM sqlite_master
WHERE tbl_name = 'table_name' AND type = 'table'

然后用 Reg Exp 解析这个值(很简单),看起来类似于:

[(.*?)]

您也可以使用:

PRAGMA table_info(table_name)

38
投票

如果您使用 SQLite 的命令行 shell,则在执行查询之前

.headers on
。您只需在给定会话中执行此操作一次。


13
投票

您可以在 sqlite 中使用 pragma 相关命令,如下所示

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")

10
投票

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

sqlite> .headers on
sqlite> .mode column

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

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

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

2
投票

使用递归查询。给定

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|

1
投票

PHP 中查询的结果集提供了几个函数来实现这一点:

    numCols() 
    columnName(int $column_number )

示例

    $db = new SQLIte3('mysqlite.db');
    $table = 'mytable';

    $tableCol = getColName($db, $table);

    for ($i=0; $i<count($tableCol); $i++){
        echo "Column $i = ".$tableCol[$i]."\n";
    }           

    function getColName($db, $table){
        $qry = "SELECT * FROM $table LIMIT 1";
        $result = $db->query($qry);
        $nCols = $result->numCols();
        for ($i = 0; $i < $ncols; $i++) {
            $colName[$i] = $result->columnName($i);
        }
        return $colName;
    }

1
投票

获取最近执行的 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)

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

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
}

代码有点草率,但似乎可以工作。


0
投票

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

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

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


0
投票

使用以下查询,将

sqlite_master
用作表名称,并
pragma_table_info
用作所有表的描述,可在单个查询中提供所有表的完整结构。

SELECT sm.name, p.* FROM sqlite_master sm, pragma_table_info(sm.name) p
WHERE sm.type = 'table'  -- just selecting the tables in sqlite_master
ORDER BY sm.name, p.cid;  -- cid in pragma_table_info is the order of the column in the desired table.

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.