424 words
2 minutes
List all columns in a SQLite database

List all columns in a SQLite database#

Here’s a devious trick for listing ALL columns in a SQLite database, using a SQL query that generates another SQL query.

The first query (demo):

select group_concat(
"select '" || name || "' as table_name, * from pragma_table_info('" || name || "')"
, ' union ') || ' order by table_name, cid'
from sqlite_master where type = 'table';

This outputs the second query, which will look something like this (demo):

select 'simple_primary_key' as table_name, * from pragma_table_info('simple_primary_key') union
select 'primary_key_multiple_columns' as table_name, * from pragma_table_info('primary_key_multiple_columns') union
select 'primary_key_multiple_columns_explicit_label' as table_name, * from pragma_table_info('primary_key_multiple_columns_explicit_label') union
select 'compound_primary_key' as table_name, * from pragma_table_info('compound_primary_key') union
select 'compound_three_primary_keys' as table_name, * from pragma_table_info('compound_three_primary_keys') union
select 'foreign_key_references' as table_name, * from pragma_table_info('foreign_key_references') union
select 'sortable' as table_name, * from pragma_table_info('sortable') union
select 'no_primary_key' as table_name, * from pragma_table_info('no_primary_key') union
select '123_starts_with_digits' as table_name, * from pragma_table_info('123_starts_with_digits') union
select 'Table With Space In Name' as table_name, * from pragma_table_info('Table With Space In Name') union
select 'table/with/slashes.csv' as table_name, * from pragma_table_info('table/with/slashes.csv') union
select 'complex_foreign_keys' as table_name, * from pragma_table_info('complex_foreign_keys') union
select 'custom_foreign_key_label' as table_name, * from pragma_table_info('custom_foreign_key_label') union
select 'units' as table_name, * from pragma_table_info('units') union
select 'tags' as table_name, * from pragma_table_info('tags') union
select 'searchable' as table_name, * from pragma_table_info('searchable') union
select 'searchable_tags' as table_name, * from pragma_table_info('searchable_tags') union
select 'searchable_fts' as table_name, * from pragma_table_info('searchable_fts') union
select 'searchable_fts_content' as table_name, * from pragma_table_info('searchable_fts_content') union
select 'searchable_fts_segments' as table_name, * from pragma_table_info('searchable_fts_segments') union
select 'searchable_fts_segdir' as table_name, * from pragma_table_info('searchable_fts_segdir') union
select 'select' as table_name, * from pragma_table_info('select') union
select 'infinity' as table_name, * from pragma_table_info('infinity') union
select 'facet_cities' as table_name, * from pragma_table_info('facet_cities') union
select 'facetable' as table_name, * from pragma_table_info('facetable') union
select 'binary_data' as table_name, * from pragma_table_info('binary_data') union
select 'roadside_attractions' as table_name, * from pragma_table_info('roadside_attractions') union
select 'attraction_characteristic' as table_name, * from pragma_table_info('attraction_characteristic') union
select 'roadside_attraction_characteristics' as table_name, * from pragma_table_info('roadside_attraction_characteristics')
order by table_name, cid

Executing that second query will return results like this:

table_namecidnametypenotnulldflt_valuepk
123_starts_with_digits0contenttext00
Table With Space In Name0pkvarchar(30)01
Table With Space In Name1contenttext00
attraction_characteristic0pkinteger01
attraction_characteristic1nametext00
binary_data0dataBLOB00
complex_foreign_keys0pkvarchar(30)01
complex_foreign_keys1f1text00
complex_foreign_keys2f2text00
complex_foreign_keys3f3text00
compound_primary_key0pk1varchar(30)01
compound_primary_key1pk2varchar(30)02
compound_primary_key2contenttext00
compound_three_primary_keys0pk1varchar(30)01
compound_three_primary_keys1pk2varchar(30)02
compound_three_primary_keys2pk3varchar(30)03
compound_three_primary_keys3contenttext00
custom_foreign_key_label0pkvarchar(30)01
custom_foreign_key_label1foreign_key_with_custom_labeltext00
facet_cities0idinteger01
facet_cities1nametext00
facetable0pkinteger01
facetable1createdtext00
facetable2planet_intinteger00
facetable3on_earthinteger00
facetable4statetext00
facetable5city_idinteger00
facetable6neighborhoodtext00
facetable7tagstext00
facetable8complex_arraytext00
facetable9distinct_some_null00
foreign_key_references0pkvarchar(30)01
foreign_key_references1foreign_key_with_labelvarchar(30)00
foreign_key_references2foreign_key_with_no_labelvarchar(30)00
infinity0valueREAL00
no_primary_key0contenttext00
no_primary_key1atext00
no_primary_key2btext00
no_primary_key3ctext00
primary_key_multiple_columns0idvarchar(30)01
primary_key_multiple_columns1contenttext00
primary_key_multiple_columns2content2text00
primary_key_multiple_columns_explicit_label0idvarchar(30)01
primary_key_multiple_columns_explicit_label1contenttext00
primary_key_multiple_columns_explicit_label2content2text00
roadside_attraction_characteristics0attraction_idINTEGER00
roadside_attraction_characteristics1characteristic_idINTEGER00
roadside_attractions0pkinteger01
roadside_attractions1nametext00
roadside_attractions2addresstext00
roadside_attractions3latitudereal00
roadside_attractions4longitudereal00
searchable0pkinteger01
searchable1text1text00
searchable2text2text00
searchable3name with . and spacestext00
searchable_fts0text100
searchable_fts1text200
searchable_fts2name with . and spaces00
searchable_fts3content00
searchable_fts_content0docidINTEGER01
searchable_fts_content1c0text100
searchable_fts_content2c1text200
searchable_fts_content3c2name with . and spaces00
searchable_fts_content4c3content00
searchable_fts_segdir0levelINTEGER01
searchable_fts_segdir1idxINTEGER02
searchable_fts_segdir2start_blockINTEGER00
searchable_fts_segdir3leaves_end_blockINTEGER00
searchable_fts_segdir4end_blockINTEGER00
searchable_fts_segdir5rootBLOB00
searchable_fts_segments0blockidINTEGER01
searchable_fts_segments1blockBLOB00
searchable_tags0searchable_idinteger01
searchable_tags1tagtext02
select0grouptext00
select1havingtext00
select2andtext00
select3jsontext00
simple_primary_key0idvarchar(30)01
simple_primary_key1contenttext00
sortable0pk1varchar(30)01
sortable1pk2varchar(30)02
sortable2contenttext00
sortable3sortableinteger00
sortable4sortable_with_nullsreal00
sortable5sortable_with_nulls_2real00
sortable6texttext00
table/with/slashes.csv0pkvarchar(30)01
table/with/slashes.csv1contenttext00
tags0tagTEXT01
units0pkinteger01
units1distanceint00
units2frequencyint00

(I generated that Markdown table by pasting the HTML from Datasette into this tool: https://jmalarcon.github.io/markdowntables/)

Better alternative using a join#

select
sqlite_master.name as table_name,
table_info.*
from
sqlite_master
join pragma_table_info(sqlite_master.name) as table_info
order by
sqlite_master.name

Demo.

This works with the pragma_table_info and pragma_index_list and pragma_foreign_key_list functions too.

Another recipe#

Amjith pointed to this query used in litecli:

SELECT
m.name as tableName,
p.name as columnName
FROM
sqlite_master m
LEFT OUTER JOIN pragma_table_info((m.name)) p ON m.name <> p.name
WHERE
m.type IN ('table', 'view')
AND m.name NOT LIKE 'sqlite_%'
ORDER BY
tableName,
columnName

Demo.

List all columns in a SQLite database
https://mranv.pages.dev/posts/list-all-columns-in-a-sqlite-database/
Author
Anubhav Gain
Published at
2024-05-13
License
CC BY-NC-SA 4.0