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.
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