izb
izb

Reputation: 51840

How can I list the tables in a SQLite database file that was opened with ATTACH?

What SQL can be used to list the tables, and the rows within those tables in an SQLite database file – once I have attached it with the ATTACH command on the sqlite3 command line tool?

Upvotes: 1428

Views: 1375681

Answers (19)

oiyio
oiyio

Reputation: 5935

I think it may be useful to refer to the official reference of SQLite under this heading:

Command Line Shell For SQLite

You can manipulate your database using the commands described in there. Besides, if you are using Windows and do not know where the command shell is, that is on the SQLite site's download page.

After downloading it, click the sqlite3.exe file to initialize the SQLite command shell. When it is initialized, by default this SQLite session is using an in-memory database, not a file on disk, and so all changes will be lost when the session exits. To use a persistent disk file as the database, enter the ".open ex1.db" command immediately after the terminal window starts up.

The example above causes the database file named "ex1.db" to be opened and used, and created if it does not previously exist. You might want to use a full pathname to ensure that the file is in the directory that you think it is in. Use forward slashes as the directory separator character. In other words use "c:/work/ex1.db", not "c:\work\ex1.db".

To see all tables in the database you have previously chosen, type the command .tables as it is said in the above link.

If you work in Windows, I think it might be useful to move this sqlite.exe file to the same folder with the other Python files. In this way, the Python file writes to and the SQLite shell reads from .db files are in the same path.

Upvotes: 9

Noah
Noah

Reputation: 15340

The easiest way to do this is to open the database directly and use the .dump command, rather than attaching it after invoking the SQLite 3 shell tool.

So instead of in the SQLite 3 shell tool,

ATTACH database.sqlite as "attached"

from your OS command line, open the database directly:

sqlite3 database.sqlite

And in the shell tool:

.dump

Upvotes: 13

flubba
flubba

Reputation:

There is a command available for this on the SQLite command line:

.tables ?PATTERN?      List names of tables matching a LIKE pattern

Which converts to the following SQL:

SELECT name FROM sqlite_master
WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'
UNION ALL
SELECT name FROM sqlite_temp_master
WHERE type IN ('table','view')
ORDER BY 1

Upvotes: 52

Wolf
Wolf

Reputation: 10238

Since the questioner did not provide a minimal reproducible example, I'll include a possible one in the following steps:

  • attach secondary in-memory database as aux

  • create a table numbers in the attached database (with schema-name set to aux)

  • inspect metadata of numbers in aux via PRAGMA table_xinfo

    ATTACH DATABASE 'file::memory:' AS aux;
    CREATE TABLE aux.numbers (v INT, name TEXT);
    PRAGMA aux.table_xinfo(numbers);
    

    Like all pragmas, pragma table_xinfo can also be used in form of a pragma function. We select its results from pragma_table_xinfo. Please note that the table name argument must be a string literal here.

    SELECT * FROM aux.pragma_table_xinfo('numbers');
    

Here is the output of both query variants (jazzed up by .mode box):

┌─────┬──────┬──────┬─────────┬────────────┬────┬────────┐
│ cid │ name │ type │ notnull │ dflt_value │ pk │ hidden │
├─────┼──────┼──────┼─────────┼────────────┼────┼────────┤
│ 0   │ v    │ INT  │ 0       │            │ 0  │ 0      │
│ 1   │ name │ TEXT │ 0       │            │ 0  │ 0      │
└─────┴──────┴──────┴─────────┴────────────┴────┴────────┘

You may be interested in the fact that you can get meta information about the pragma “tables” themselves, try pragma table_xinfo(pragma_xinfo); if you're curious.

Upvotes: 0

Ajeet Verma
Ajeet Verma

Reputation: 3056

To get a list of tables in a SQLite database, you can use a simple SQL query. In SQLite, there's a table called sqlite_master that stores metadata about the database schema, including the table names. You can query this table to retrieve the names of all tables in the database.

Let's assume, for example, we have two tables, table1 and table2 in the SQLite database.

Here's the SQL query to fetch the list of tables in the SQLite database:

SELECT name FROM sqlite_master WHERE type='table';

Output:

[('table1',), ('sqlite_sequence',), ('table2',)]

Filter the results to only include entries of type 'table' while excluding internal SQLite tables (those starting with sqlite_).

SELECT name FROM sqlite_master
WHERE type='table' AND name NOT LIKE 'sqlite_%';

Output:

[('table1',), ('table2',)]

Upvotes: 6

Klaas-Z4us-V
Klaas-Z4us-V

Reputation: 337

Use .da to see all databases - one is called 'main'.

Tables of this database can be seen by:

SELECT distinct tbl_name from sqlite_master order by 1;

The attached databases need prefixes you chose with AS in the statement ATTACH, e.g., aa (, bb, cc...) so:

SELECT distinct tbl_name from **aa.sqlite_master** order by 1;

Note that here you get the views as well. To exclude these add:

where type = 'table'

before ' order'

Upvotes: 13

Alix Axel
Alix Axel

Reputation: 154643

According to the documentation, the equivalent of MySQL's SHOW TABLES; is:

The ".tables" command is similar to setting list mode then executing the following query:

SELECT name FROM sqlite_master
  WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'
UNION ALL
SELECT name FROM sqlite_temp_master
  WHERE type IN ('table','view')
ORDER BY 1;

However, if you are checking if a single table exists (or to get its details), see LuizGeron's answer.

Upvotes: 22

GameLoading
GameLoading

Reputation: 6708

I use this query to get it:

SELECT name FROM sqlite_master WHERE type='table'

And to use in iOS:

NSString *aStrQuery=[NSString stringWithFormat:@"SELECT name FROM sqlite_master WHERE type='table'"];

Upvotes: 39

openwonk
openwonk

Reputation: 15577

Via a union all, combine all tables into one list.

select name
from sqlite_master 
where type='table'

union all 

select name 
from sqlite_temp_master 
where type='table'

Upvotes: 12

Mrityunjay Singh
Mrityunjay Singh

Reputation: 497

Use:

import sqlite3

TABLE_LIST_QUERY = "SELECT * FROM sqlite_master where type='table'"

Upvotes: 11

pepper
pepper

Reputation: 2197

As of the latest versions of SQLite 3 you can issue:

.fullschema

to see all of your create statements.

Upvotes: 18

Lasse V. Karlsen
Lasse V. Karlsen

Reputation: 391596

It appears you need to go through the sqlite_master table, like this:

SELECT * FROM dbname.sqlite_master WHERE type='table';

And then manually go through each table with a SELECT or similar to look at the rows.

The .DUMP and .SCHEMA commands doesn't appear to see the database at all.

Upvotes: 472

Antony.H
Antony.H

Reputation: 965

Use .help to check for available commands.

.table

This command would show all tables under your current database.

Upvotes: 76

Mark Janssen
Mark Janssen

Reputation: 15185

There are a few steps to see the tables in an SQLite database:

  1. List the tables in your database:

    .tables
    
  2. List how the table looks:

    .schema tablename
    
  3. Print the entire table:

    SELECT * FROM tablename;
    
  4. List all of the available SQLite prompt commands:

    .help
    

Upvotes: 1463

Rafał Dowgird
Rafał Dowgird

Reputation: 45141

To list the tables you can also do:

SELECT name FROM sqlite_master
WHERE type='table';

Upvotes: 44

Luiz Geron
Luiz Geron

Reputation: 1387

Try PRAGMA table_info(table-name);
http://www.sqlite.org/pragma.html#schema

Upvotes: 36

Anthony Williams
Anthony Williams

Reputation: 68671

The .tables, and .schema "helper" functions don't look into ATTACHed databases: they just query the SQLITE_MASTER table for the "main" database. Consequently, if you used

ATTACH some_file.db AS my_db;

then you need to do

SELECT name FROM my_db.sqlite_master WHERE type='table';

Note that temporary tables don't show up with .tables either: you have to list sqlite_temp_master for that:

SELECT name FROM sqlite_temp_master WHERE type='table';

Upvotes: 702

Christian Davén
Christian Davén

Reputation: 18207

To show all tables, use

SELECT name FROM sqlite_master WHERE type = "table"

To show all rows, I guess you can iterate through all tables and just do a SELECT * on each one. But maybe a DUMP is what you're after?

Upvotes: 197

trf
trf

Reputation:

The ".schema" commando will list available tables and their rows, by showing you the statement used to create said tables:

sqlite> create table_a (id int, a int, b int);
sqlite> .schema table_a
CREATE TABLE table_a (id int, a int, b int);

Upvotes: 7

Related Questions