Metadati di informazioni schema SQLite

Ho bisogno di ottenere i nomi delle colonne e le loro tabelle in un database SQLite. Quello di cui ho bisogno è un set di risultati con 2 colonne: table_name | column_name table_name | column_name .

In MySQL, sono in grado di ottenere queste informazioni con una query SQL sul database INFORMATION_SCHEMA . Tuttavia SQLite offre table sqlite_master :

 sqlite> create table students (id INTEGER, name TEXT); sqlite> select * from sqlite_master; table|students|students|2|CREATE TABLE students (id INTEGER, name TEXT) 

che risulta una query di costruzione DDL ( CREATE TABLE ) che non è utile per me e ho bisogno di analizzare questo per ottenere informazioni rilevanti.

Ho bisogno di ottenere l’elenco delle tabelle e unirle a colonne o semplicemente ottenere colonne insieme alla colonna del nome della tabella. Quindi PRAGMA table_info(TABLENAME) non funziona per me dato che non ho il nome della tabella. Voglio ottenere tutti i metadati della colonna nel database.

C’è un modo migliore per ottenere tali informazioni come risultato impostato mediante l’interrogazione del database?

Hai praticamente chiamato la soluzione nella tua domanda.

Per ottenere un elenco di tabelle (e viste), esegui query sqlite_master come in

 SELECT name, sql FROM sqlite_master WHERE type='table' ORDER BY name; 

(vedi le FAQ SQLite )

Per ottenere informazioni sulle colonne in una tabella specifica, utilizzare PRAGMA table_info(table-name); come spiegato nella documentazione SQLite PRAGMA .

Non conosco alcun modo per ottenere tablename | columnname restituito come risultato di una singola query. Non credo che SQLite supporti questo. La soluzione migliore è probabilmente quella di utilizzare i due metodi insieme per restituire le informazioni che stai cercando: prima ottieni l’elenco delle tabelle usando sqlite_master, quindi esegui un ciclo attraverso di esse per ottenere le loro colonne usando PRAGMA table_info ().

Ci sono i comandi “.tables” e “.schema [table_name]” che danno una specie di versione separata al risultato ottenuto da “select * from sqlite_master;”

C’è anche “pragma table_info ([table_name]);” comando per ottenere un risultato migliore per l’analisi anziché per una query di costruzione:

 sqlite> .tables students sqlite> .schema students create table students(id INTEGER, name TEXT); sqlite> pragma table_info(students); 0|id|INTEGER|0||0 1|name|TEXT|0||0 

Spero, aiuta in una certa misura …

Per tua informazione, se stai usando .Net puoi usare il metodo DbConnection.GetSchema per recuperare le informazioni che solitamente si trovano in INFORMATION_SCHEMA. Se si dispone di un livello di astrazione è ansible avere lo stesso codice per tutti i tipi di database (NOTA che MySQL sembra gestire i primi 2 argomenti dell’array delle restrizioni).

Un altro trucco utile è quello di ottenere prima tutti i nomi delle tabelle da sqlite_master.

Quindi, per ognuno di essi, triggersre una query “select * from t where 1 = 0”. Se si analizza la struttura della query risultante, dipende da quale lingua / API si sta chiamando da, si ottiene una struttura ricca che descrive le colonne.

In pitone

 c = ...db.cursor() c.execute("select * from t where 1=0"); c.fetchall(); print c.description; 

Juraj

PS. Ho l’abitudine di usare ‘where 1 = 0’ perché la syntax che limita il record sembra variare da db a db. Inoltre, un buon database ottimizzerà questa clausola sempre falsa.

Lo stesso effetto, in SQLite, si ottiene con ‘limite 0’.

Prova questo parser di schema di tabella sqlite, ho implementato il parser di tabella sqlite per analizzare le definizioni di tabella in PHP.

Restituisce le definizioni complete (unico, chiave primaria, tipo, precisione, non null, riferimenti, vincoli di tabella … ecc.)

https://github.com/maghead/sqlite-parser

La syntax segue la syntax dell’istruzione della tabella sqlite create: http://www.sqlite.org/lang_createtable.html

Questa è una vecchia domanda, ma a causa del numero di volte in cui è stata visualizzata, stiamo aggiungendo alla domanda per il semplice motivo che la maggior parte delle risposte ti dice come trovare i nomi di TABLE nel Database SQLite COSA FACCIA QUANDO IL NOME DELLA TABELLA NON È NELLA BANCA DATI? Questo sta accadendo alla nostra app perché stiamo creando TABELLE a livello di codice. Quindi il codice riportato di seguito si occuperà del problema quando la TABELLA NON è inserita o creata dal Database Enjoy

  public void toPageTwo(View view){ if(etQuizTable.getText().toString().equals("")){ Toast.makeText(getApplicationContext(), "Enter Table Name\n\n" +" OR"+"\n\nMake Table First", Toast.LENGTH_LONG ).show(); etQuizTable.requestFocus(); return; } NEW_TABLE = etQuizTable.getText().toString().trim(); db = dbHelper.getWritableDatabase(); ArrayList arrTblNames = new ArrayList<>(); Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null); if (c.moveToFirst()) { while ( !c.isAfterLast() ) { arrTblNames.add( c.getString( c.getColumnIndex("name")) ); c.moveToNext(); } } c.close(); db.close(); boolean matchFound = false; for(int i=0;i