Metadane Informacji O Schemacie SQLite

Muszę pobrać nazwy kolumn i ich tabele w bazie danych SQLite. Potrzebuję resultset z 2 kolumnami: table_name | column_name.

W MySQL, jestem w stanie uzyskać te informacje za pomocą zapytania SQL na bazie danych INFORMATION_SCHEMA. Jednak SQLite oferuje tabelę 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)

Co powoduje zapytanie konstrukcyjne DDL (CREATE TABLE), które nie jest dla mnie pomocne i muszę to przeanalizować, aby uzyskać odpowiednie informacje.

Muszę uzyskać listę tabel i połączyć je z kolumnami lub po prostu uzyskać kolumny wzdłuż z kolumną nazwa tabeli. Więc PRAGMA table_info(TABLENAME) nie działa dla mnie, ponieważ nie mam nazwy tabeli. Chcę uzyskać wszystkie metadane kolumn w bazie danych.

Czy jest lepszy sposób, aby uzyskać te informacje jako wynik ustawiony przez odpytywanie bazy danych?

Author: Ahmet Alp Balkan - Google, 2011-06-24

6 answers

W zasadzie podałeś rozwiązanie w swoim pytaniu.

Aby uzyskać listę tabel (i widoków), zapytanie sqlite_master jak w

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

(Zobacz FAQ SQLite )

Aby uzyskać informacje o kolumnach w konkretnej tabeli, użyj PRAGMA table_info(table-name);, Jak wyjaśniono w dokumentacji SQLite PRAGMA.

Nie znam żadnego sposobu na zwrócenie tablename|columnname jako wyniku pojedynczego zapytania. Nie wierzę, że SQLite to wspiera. Najlepiej będzie, jeśli użyj dwóch metod razem, aby zwrócić informacje, których szukasz - najpierw uzyskaj listę tabel za pomocą sqlite_master, a następnie wykonaj pętlę, aby uzyskać ich kolumny za pomocą PRAGMA table_info ().

 69
Author: Tom Juergens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-07 22:19:28

Są ".tabele "i".schema [table_name] "polecenia, które dają rodzaj oddzielonej wersji do wyniku otrzymanego z" select * from sqlite_master; "

Istnieje również polecenie " pragma table_info ([table_name]);", aby uzyskać lepszy wynik dla parsowania zamiast zapytania konstrukcyjnego:


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
Nadzieja, do pewnego stopnia pomaga...
 9
Author: Mustafa Zengin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-23 22:49:43

Dla twojej wiadomości, Jeśli używasz. Net, możesz użyć metody DbConnection.GetSchema, aby pobrać informacje, które zwykle znajdują się w INFORMATION_SCHEMA. Jeśli masz warstwę abstrakcji, możesz mieć ten sam kod dla wszystkich typów baz danych(zauważ, że MySQL wydaje się zmieniać 1st 2 argumenty tablicy ograniczeń).

 4
Author: user276648,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-23 02:50:20

Kolejną użyteczną sztuczką jest najpierw pobranie wszystkich nazw tabel z sqlite_master.

Następnie dla każdego z nich odpal zapytanie "select * from t where 1 = 0". Jeśli przeanalizujesz strukturę zapytania wynikowego-zależy od tego, z jakiego języka / api go wywołujesz-otrzymasz bogatą strukturę opisującą kolumny.

W Pythonie

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

Juraj

PS. Mam w zwyczaju używać 'where 1=0', ponieważ składnia ograniczająca rekord wydaje się różnić od db do db. Ponadto, dobra baza danych zoptymalizuje tę klauzulę always-false.

Ten sam efekt, w SQLite, jest osiągany z 'limit 0'.

 4
Author: Juraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-03 19:57:46

Wypróbuj ten parser schematu tabeli SQLite, zaimplementowałem parser tabeli SQLite do analizy definicji tabeli w PHP.

Zwraca pełne definicje (unique, primary key, type, precision, not null, references, Table constraints... etc)

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

Składnia jest następująca: składnia instrukcji SQLite create table: http://www.sqlite.org/lang_createtable.html

 2
Author: c9s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-13 11:24:47

Jest to stare pytanie, ale ze względu na liczbę wyświetleń, dodajemy do pytania z prostego powodu większość odpowiedzi mówi ci, jak znaleźć nazwy tabel w bazie danych SQLite CO ZROBIĆ, GDY NAZWA TABELI NIE ZNAJDUJE SIĘ W BAZIE DANYCH ? Dzieje się tak z naszą aplikacją, ponieważ tworzymy tabele programowo Tak więc poniższy kod rozwiąże problem, gdy tabela nie znajduje się w bazie danych 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<String> 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<arrTblNames.size();i++) {
        if(arrTblNames.get(i).equals(NEW_TABLE)) {
            Intent intent = new Intent(ManageTables.this, TableCreate.class 
   );
            startActivity( intent );
            matchFound = true;
        }
    }
    if (!matchFound) {
        Toast.makeText(getApplicationContext(), "No Such Table\n\n"
                +"           OR"+"\n\nMake Table First", Toast.LENGTH_LONG 
 ).show();
        etQuizTable.requestFocus();
    }
}
 0
Author: James_Duh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-29 02:21:55