Метаданные Информации Схемы SQLite

мне нужно получить имена столбцов и таблиц в базе данных SQLite. Мне нужен resultset с 2 столбцами:table_name | column_name.

в MySQL я могу получить эту информацию с помощью SQL-запроса в базе данных INFORMATION_SCHEMA. Однако SQLite предлагает таблицу 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)

что приводит к запросу на построение DDL (CREATE TABLE), что не полезно для меня и мне нужно разобрать это, чтобы получить соответствующую информацию.

мне нужно получить список таблиц и присоединиться к ним с столбцы или просто получить столбцы вместе со столбцом имени таблицы. Так что PRAGMA table_info(TABLENAME) не работает для меня, так как у меня нет имени таблицы. Я хочу получить все метаданные столбцов в базе данных.

есть ли лучший способ получить эту информацию в результате набора путем запроса базы данных?

6 ответов


вы в основном назвали решение в своем вопросе.

чтобы получить список таблиц (и представлений), запросите sqlite_master как в

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

(см. SQLite FAQ)

чтобы получить информацию о Столбцах в определенной таблице, используйте PRAGMA table_info(table-name); Как поясняется в документация SQLite PRAGMA.

Я не знаю, как получить tablename / columnname, возвращаемое в результате одного запроса. Я не верю в SQLite поддерживать этот. Лучше всего, вероятно, использовать два метода вместе, чтобы вернуть информацию, которую вы ищете - сначала получить список таблиц с помощью sqlite_master, а затем цикл через них, чтобы получить свои столбцы с помощью PRAGMA table_info().


есть ".таблица или." schema [table_name] "команды, которые дают вид отдельной версии результата, который вы получаете от" select * from sqlite_master;"

существует также команда" pragma table_info([table_name]);", чтобы получить лучший результат для синтаксического анализа вместо запроса конструкции:


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

надеюсь, это поможет в какой-то степени...


FYI, если вы используете .Net, вы можете использовать DbConnection.GetSchema метод для получения информации, которая обычно находится в INFORMATION_SCHEMA. Если у вас есть слой абстракции, вы можете иметь один и тот же код для всех типов баз данных (обратите внимание, что MySQL, кажется, swich 1st 2 аргументов массива ограничений).


еще один полезный трюк, чтобы сначала получить все имена таблиц из sqlite_master.

затем для каждого из них запустите запрос "select * from t, где 1 = 0". Если вы проанализируете структуру результирующего запроса-зависит от того, на каком языке/api вы его вызываете - вы получите богатую структуру, описывающую столбцы.

в python

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

Юрай

PS. Я привык использовать "где 1=0", потому что синтаксис ограничения записи, похоже, меняется от БД к БД. Кроме того, хорошая база данных оптимизирует это предложение always-false.

тот же эффект в SQLite достигается с помощью 'limit 0'.


попробуйте эту таблицу SQLite анализатор схему, я реализовал парсер таблицы SQLite для разбора определений таблицы в PHP.

он возвращает полные определения (уникальный, первичный ключ, тип, точность, не null, ссылки, ограничения таблицы... и т. д.)

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

синтаксис следует за синтаксисом инструкции SQLite create table:http://www.sqlite.org/lang_createtable.html


Это старый вопрос, но из-за количества раз, когда он был просмотрен, мы добавляем к вопросу по простой причине, большинство ответов говорят вам, как найти имена таблиц в базе данных SQLite ЧТО ДЕЛАТЬ, ЕСЛИ ИМЯ ТАБЛИЦЫ ОТСУТСТВУЕТ В БАЗЕ ДАННЫХ ? Это происходит с нашим приложением, потому что мы создаем таблицы программно Таким образом, приведенный ниже код будет решать проблему, когда таблица не находится или не создается базой данных 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();
    }
}