将SQLite空表导出为带有标题的csv

将SQLite空表导出为带有标题的csv,sqlite,Sqlite,当我将表从SQLite数据库导出到带有标题的csv文件时,为空的表将返回一个空的csv文件。 我想获得一个csv文件,在这种情况下,只有标题 这里有一个例子 使用tblA和tblB创建一个数据库,其中表a没有数据 sqlite3 test.sqlite CREATE TABLE tblA ( ID LONG, Col01 TEXT ); CREATE TABLE tblB ( ID LONG, Col01 TEXT ); INSERT INTO tblB (ID, Co

当我将表从SQLite数据库导出到带有标题的csv文件时,为空的表将返回一个空的csv文件。
我想获得一个csv文件,在这种情况下,只有标题

这里有一个例子

使用tblA和tblB创建一个数据库,其中表a没有数据

sqlite3 test.sqlite

CREATE TABLE tblA (
  ID LONG,
  Col01 TEXT
 );

CREATE TABLE tblB (
  ID LONG,
  Col01 TEXT
 );

INSERT INTO tblB (ID, Col01)
VALUES
(1, "AAA"), 
(2, "BBB");

.quit
以csv格式导出所有表:

# obtain all data tables from database
tables=`sqlite3 test.sqlite "SELECT tbl_name FROM sqlite_master WHERE type='table' and tbl_name not like 'sqlite_%';"`

for i in $tables ; do 
    sqlite3 -header -csv test.sqlite "select * from $i;" > "$i.csv" ;
done
检查这些csv文件的内容:

[tmp] : head *csv
==> tblA.csv <==

==> tblB.csv <==
ID,Col01
1,AAA
2,BBB
[tmp]:头*csv

==>tblA.csv tblB.csv tblA.csv tblB.csv一个选项是利用
pragma
获取列名,然后只附加行的内容:

for i in $tables ; do
    sqlite3 test.sqlite "pragma table_info($i)" | cut -d '|' -f 2 | paste -s -d, > "$i.csv"
    sqlite3 -csv test.sqlite "select * from $i;" >> "$i.csv"
done
结果:

$ cat tblA.csv ID,Col01 $ cat tblB.csv ID,Col01 1,AAA 2,BBB $cat tblA.csv 身份证,Col01 $cat tblB.csv 身份证,Col01 1,AAA 2,BBB
您还可以使用
从pragma_table_info('table_name')中选择group_concat(name,,')
直接获取逗号分隔的名称。@Shawn Nice,这样更干净。更新的答案。谢谢你的回答。我没有任何布拉格表格信息。我的sqlite版本是3.8.8。你认为这可能是原因吗?@Gilles嗯,奇怪。我最初的回答使用了
pragma table_info
语句,而不是上述评论者推荐的
pragma table_info
表格。如果你想试试的话,我已经把我的答案回滚到原来的版本了。是的,现在它工作得很好。这两种解决方案可能都有用。谢谢 $ cat tblA.csv ID,Col01 $ cat tblB.csv ID,Col01 1,AAA 2,BBB