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?
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 ().
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...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ń).
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'.
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
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();
}
}
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