studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones database sqlite schema

database - programacion - Buscar nombres de columna SQLite en tabla vacía



manual de programacion android pdf (6)

Ejecuta esta consulta

select * from (select "") left join my_table_to_test b on -1 = b.rowid;

Puedes probarlo en el motor sqlite en línea

Para las patadas, estoy escribiendo una herramienta de "documentación de esquemas" que genera una descripción de las tablas y relaciones en una base de datos. Actualmente estoy haciendo ajustes para trabajar con SQLite.

sqlite_master extraer los nombres de todas las tablas en una base de datos SQLite mediante una consulta en la tabla sqlite_master . Para cada nombre de tabla, luego disparo un simple

select * from <table name>

consulta, luego use las API sqlite3_column_count() y sqlite3_column_name() para recopilar los nombres de las columnas, que también realizo a sqlite3_table_column_metadata() para obtener información adicional. Lo suficientemente simple, ¿verdad?

El problema es que solo funciona para tablas que no están vacías. Es decir, las API sqlite_column_*() solo son válidas si sqlite_step() ha devuelto SQLITE_ROW , que no es el caso de las tablas vacías.

Entonces, la pregunta es, ¿cómo puedo descubrir nombres de columna para tablas vacías? O, de manera más general, ¿hay una forma mejor de obtener este tipo de información de esquema en SQLite?

Siento que debe haber otra tabla sqlite_xxx escondida sqlite_xxx acecho en algún lugar que contenga esta información, pero hasta ahora no he podido encontrarla.


Ejecute la consulta:

PRAGMA table_info( your_table_name );

Documentation


La declaración PRAGMA sugerida por @pragmanatu funciona bien a través de cualquier interfaz programática, también. Alternativamente, la columna sql de sqlite_master tiene la instrucción SQL CREATE TABLE &c &c que describe la tabla (pero, tendría que analizarla, por lo que creo que PRAGMA table_info es más ... pragmática ;-).


Si está demandando SQLite 3.8.3 o posterior (admite la cláusula WITH), esta consulta recursiva debería funcionar para tablas básicas. En CTAS, YMMV.

WITH Recordify(tbl_name, Ordinal, Clause, Sql) AS ( SELECT tbl_name, 0, '''', Sql FROM ( SELECT tbl_name, substr ( Sql, instr(Sql, ''('') + 1, length(Sql) - instr(Sql, ''('') - 1 ) || '','' Sql FROM sqlite_master WHERE type = ''table'' ) UNION ALL SELECT tbl_name, Ordinal + 1, trim(substr(Sql, 1, instr(Sql, '','') - 1)), substr(Sql, instr(Sql, '','') + 1) FROM Recordify WHERE Sql > '''' AND lower(trim(Sql)) NOT LIKE ''check%'' AND lower(trim(Sql)) NOT LIKE ''unique%'' AND lower(trim(Sql)) NOT LIKE ''primary%'' AND lower(trim(Sql)) NOT LIKE ''foreign%'' AND lower(trim(Sql)) NOT LIKE ''constraint%'' ), -- Added to make querying a subset easier. Listing(tbl_name, Ordinal, Name, Constraints) AS ( SELECT tbl_name, Ordinal, substr(Clause, 1, instr(Clause, '' '') - 1), trim(substr(Clause, instr(Clause, '' '') + 1)) FROM Recordify WHERE Ordinal > 0 ) SELECT tbl_name, Ordinal, Name, Constraints FROM Listing ORDER BY tbl_name, lower(Name);


PRAGMA table_info( your_table_name ); no funciona en HTML5 SQLite.

Aquí hay un pequeño fragmento HTML5 SQLite JavaScript que obtiene los nombres de las columnas de your_table_name, incluso si está vacío. Espero que sea útil.

tx.executeSql(''SELECT name, sql FROM sqlite_master WHERE type="table" AND name = "your_table_name";'', [], function (tx, results) { var columnParts = results.rows.item(0).sql.replace(/^[^/(]+/(([^/)]+)/)/g, ''$1'').split('',''); var columnNames = []; for(i in columnParts) { if(typeof columnParts[i] === ''string'') columnNames.push(columnParts[i].split(" ")[0]); } console.log(columnNames); ///// Your code which uses the columnNames; });


sqlite> .header on sqlite> .mode column sqlite> create table ABC(A TEXT, B VARCHAR); sqlite> pragma table_info(ABC); cid name type notnull dflt_value pk ---------- ---------- ---------- ---------- ---------- ---------- 0 A TEXT 0 0 1 B VARCHAR 0 0