Aquí hay dos formas de devolver una lista de tablas en todas las bases de datos adjuntas en SQLite.
El primer método devuelve todas las tablas y vistas de todas las bases de datos adjuntas.
El segundo método da la opción de devolver tanto las tablas como las vistas, o sólo las tablas, pero sólo para la base de datos primaria.
El comando .tables
La forma más sencilla de devolver una lista de tablas cuando se utiliza el shell de la línea de comandos de SQLite es utilizar el comando .tables
.
Este comando puede utilizarse con o sin argumento. Si se utiliza sin proporcionar un argumento, devuelve todas las tablas (y vistas) de todas las bases de datos adjuntas.
Ejemplo:
.tables
Resultado:
Album Employee InvoiceLine PlaylistTrackArtist Genre MediaType Track Customer Invoice Playlist
En mi caso, sólo hay una base de datos adjunta (la base de datos de ejemplo Chinook), y se devuelven todas las tablas de esta base de datos.
Como se ha mencionado, también se puede proporcionar un argumento a este comando. Dicho argumento puede utilizarse para limitar las tablas devueltas por el comando. Por ejemplo, puede nombrar una tabla específica, o puede utilizar la coincidencia de patrones para devolver sólo las tablas que coinciden con un patrón dado.
Ejemplo:
.tables a%
Resultado:
Album Artist
En este caso sólo se devuelven las tablas que empiezan por la letra «a».
Una cosa a tener en cuenta es que el comando .tables
devuelve tanto tablas como vistas. Si desea excluir las vistas de los resultados, puede utilizar la coincidencia de patrones para excluir las vistas. Esto sólo funcionará si las vistas utilizan una convención de nombres que las distinga de las tablas y otros objetos.
Otra forma de excluir las vistas de los resultados es consultar directamente la tabla sqlite_master. Aunque esta tabla también contiene vistas, puede utilizar SQL para excluirlas de los resultados si es necesario.
La tabla sqlite_master
Cada base de datos SQLite tiene una tabla sqlite_master que define el esquema de la base de datos. Puedes usar esta tabla para devolver una lista de tablas en tu base de datos.
Cuando se utiliza el comando .tables
, es similar a hacer esto:
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Sin embargo, hay una diferencia.
La diferencia es que este método sólo devuelve los resultados de la base de datos primaria (el comando .tables
devuelve los resultados de todas las bases de datos adjuntas).
Al ejecutar la consulta anterior se obtiene el siguiente resultado:
AlbumArtistCustomerEmployeeGenreInvoiceInvoiceLineMediaTypePlaylistPlaylistTrackTrack
Esta consulta devuelve tanto las tablas como las vistas (al igual que el comando .tables
).
En mi caso no hay vistas, pero si quieres excluir las vistas en los resultados, utiliza esto:
SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Resultado:
AlbumArtistCustomerEmployeeGenreInvoiceInvoiceLineMediaTypePlaylistPlaylistTrackTrack
Excluir vistas
Para completar, aquí hay un ejemplo rápido que utiliza una base de datos con una vista. Esta base de datos contiene una tabla (llamada Productos) y una vista (llamada vProductos).
Conéctese a SQLite/la base de datos:
sqlite3 Store.db
Ejecute el comando .tables
:
.tables
Resultado:
Products vProducts
Consultar la tabla sqlite_master para tablas y vistas:
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Resultado:
ProductsvProducts
Consultar ahora sqlite_master sólo para tablas:
SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Resultado:
Products
Tablas temporales
El comando .table devuelve tanto tablas permanentes como tablas temporales. La tabla sqlite_master sólo contiene tablas permanentes. Si necesita devolver sólo las tablas temporales, puede consultar sqlite_temp_master.
Para devolver tanto las tablas permanentes como las temporales, puede utilizar una consulta como ésta:
SELECT name FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master)WHERE type='table'ORDER BY name;