Метаданные Информации Схемы 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();
}
}