517

I'm just getting started learning SQLite. It would be nice to be able to see the details for a table, like MySQL's DESCRIBE [table]. PRAGMA table_info [table] isn't good enough, as it only has basic information (for example, it doesn't show if a column is a field of some sort or not). Does SQLite have a way to do this?

9 Answers 9

628

The SQLite command line utility has a .schema TABLENAME command that shows you the create statements.

Sign up to request clarification or add additional context in comments.

7 Comments

You can use ".schema" without a table and it'll show you all of them.
Don't forget to leave out the semi-colon at the end of the statement
@Simon a semi-colon will cause the command to silently fail.
@djeikyb. shouldn't this be considered a bug?
Note that .schema is a command for the sqlite3-shell and NOT valid SQL. Meaning if you want to get the table-info in an application, you have to use @Strater's answer.
|
350
PRAGMA table_info([tablename]); 

5 Comments

This seems more equivalent to MySQL's describe than .schema tablename to me.
Yep. This worked for me. .schema TABLENAME didn't. .schema alone, however, does show you all the create statements, but the result from PRAGMA is a lot more useful if I just want to look at one table.
Addendum: The only thing I'm noticing is that it does not output PRIMARY KEY when I create a table with INTEGER PRIMARY KEY, just INTEGER.
@AkoiMeexx: From my original question: "PRAGMA table_info [table] isn't good enough, as it only has basic information (for example, it doesn't show if a column is a field of some sort or not)."
It also displays the data in a more table like format rather than looking at the CREATE statement from the .schema command
135

Are you looking for the SQL used to generate a table? For that, you can query the sqlite_schema table:

sqlite> CREATE TABLE foo (bar INT, quux TEXT); sqlite> SELECT * FROM sqlite_schema; table|foo|foo|2|CREATE TABLE foo (bar INT, quux TEXT) sqlite> SELECT sql FROM sqlite_schema WHERE name = 'foo'; CREATE TABLE foo (bar INT, quux TEXT) 
Alternative Names

The schema table can always be referenced using the name sqlite_schema, especially if qualifed by the schema name like main.sqlite_schema or temp.sqlite_schema. But for historical compatibility, some alternative names are also recognized, including:

  1. sqlite_master
  2. sqlite_temp_schema
  3. sqlite_temp_master

Alternatives (2) and (3) only work for the TEMP database associated with each database connection, but alternative (1) works anywhere.

3 Comments

Is there any difference between this and .schema foo?
@Matthew: .schema can only be used from a command line; the above commands can be run as a query through a library (Python, C#, etc.).
@MarkRushakoff But the result is the same?
62

To see all tables:

.tables 

To see a particular table:

.schema [tablename] 

1 Comment

@PayelSenapati The brackets are just to indicate that tablename is an optional parameter.
9

To prevent that people are mislead by some of the comments to the other answers:

  1. If .schema or query from sqlite_master not gives any output, it indicates a non-existent tablename, e.g. this may also be caused by a ; semicolon at the end for .schema, .tables, ... Or just because the table really not exists. That .schema just doesn't work is very unlikely and then a bug report should be filed at the sqlite project.

... .schema can only be used from a command line; the above commands > can be run as a query through a library (Python, C#, etc.). – Mark Rushakoff Jul 25 '10 at 21:09

  1. 'can only be used from a command line' may mislead people. Almost any (likely every?) programming language can call other programs/commands. Therefore the quoted comment is unlucky as calling another program, in this case sqlite, is more likely to be supported than that the language provides a wrapper/library for every program (which not only is prone to incompleteness by the very nature of the masses of programs out there, but also is counter acting single-source principle, complicating maintenance, furthering the chaos of data in the world).

1 Comment

Anybody writing a program to retrieve data from any SQL database should use the proper SQL drivers available to their programming language for accessing the database and performing queries on it. That is the appropriate way to access a database. I would never recommend hacking a command-line program designed to provide ad-hoc queries. Your suggestion is deeply mistaken. A command-line program for ad-hoc queries is CERTAINLY NOT the most appropriate access point for program code to run queries on a database. Using SQL drivers is CERTAINLY NOT 'complicating maintenance' - it is best practice.
7

".schema" can show more details of tables including Table Constraints than "PRAGMA".

This command below shows the details of all tables:

.schema 

This command below shows the details of all tables in a well-formatted way:

.schema --indent 

This command below shows the details of one table:

.schema <table_name> 

These commands below show the details of one table in a well-formatted way:

.schema --indent <table_name> 

Or:

.schema <table_name> --indent 

In addition, these commands below show the details about ".schema":

.help .schema 

Or:

.help schema 

Then, this is how it looks like below:

sqlite> .help .schema .schema ?PATTERN? Show the CREATE statements matching PATTERN Options: --indent Try to pretty-print the schema --nosys Omit objects whose names start with "sqlite_" 

Comments

3

If you're using a graphical tool. It shows you the schema right next to the table name. In case of DB Browser For Sqlite, click to open the database(top right corner), navigate and open your database, you'll see the information populated in the table as below.

enter image description here

right click on the record/table_name, click on copy create statement and there you have it.

Hope it helped some beginner who failed to work with the commandline.

Comments

1

.schema user_meta didn't work for me. but .schema did show me all the tables.

I was able to see user_meta table using this command:

sqlite> SELECT * FROM sqlite_master WHERE type='table' AND name='user_meta'; table|user_meta|user_meta|7|CREATE TABLE user_meta ( id INTEGER NOT NULL, user_id INTEGER NOT NULL, first_name VARCHAR(10), last_name VARCHAR(10), PRIMARY KEY (id), CONSTRAINT fk_user_id FOREIGN KEY(user_id) REFERENCES user (id), UNIQUE (user_id) ) 

Comments

0

For example, I have these tables in my Django SQLite database:

sqlite3 db.sqlite3 

Then

.tables 

In order to describe and see the SQL statements for shop_product table, you can run the following command:

.schema shop_product 

Illustration

Illustration

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.