Как проверить в SQLite, существует ли таблица? - PullRequest
824 голосов
/ 21 октября 2009

Как мне, надежно , проверить в SQLite, существует ли конкретная пользовательская таблица?

Я не прошу ненадежных способов, таких как проверка, вернул ли «select *» в таблице ошибку или нет (это даже хорошая идея?).

Причина такова:

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

Если они уже существуют, мне нужно обновить некоторые таблицы.

Должен ли я вместо этого использовать другой путь, чтобы указать, что соответствующие таблицы уже созданы - например, путем создания / установки / установки определенного флага в файле инициализации / настройки моей программы на диске или что-то в этом роде?

Или мой подход имеет смысл?

Ответы [ 21 ]

10 голосов
/ 24 апреля 2014

Обратите внимание, что для проверки наличия таблицы в базе данных TEMP необходимо использовать sqlite_temp_master вместо sqlite_master:

SELECT name FROM sqlite_temp_master WHERE type='table' AND name='table_name';
8 голосов
/ 11 июня 2012

Вот функция, которую я использовал:

Учитывая объект базы данных SQL = db

public boolean exists(String table) {
    try {
         db.query("SELECT * FROM " + table);
         return true;
    } catch (SQLException e) {
         return false;
    }
}
7 голосов
/ 20 декабря 2013

Используйте этот код:

SELECT name FROM sqlite_master WHERE type='table' AND name='yourTableName';

Если количество возвращаемых массивов равно 1, это означает, что таблица существует. В противном случае его не существует.

3 голосов
/ 18 января 2019

Самый надежный способ, который я нашел в C # на данный момент, с использованием последнего пакета sqlite-net-pcl nuget (1.5.231), использующего SQLite 3, заключается в следующем:

var result = database.GetTableInfo(tableName);
if ((result == null) || (result.Count == 0))
{
    database.CreateTable<T>(CreateFlags.AllImplicit);
}
3 голосов
/ 28 октября 2014

Используйте

SELECT 1 FROM table LIMIT 1;

для предотвращения чтения всех записей.

1 голос
/ 02 августа 2018

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

SELECT name FROM sqlite_master WHERE name='table_name'

Здесь table_name - это имя вашей таблицы, которое вы создали. Например

 CREATE TABLE IF NOT EXISTS country(country_id INTEGER PRIMARY KEY AUTOINCREMENT, country_code TEXT, country_name TEXT)"

и чек

  SELECT name FROM sqlite_master WHERE name='country'
1 голос
/ 11 апреля 2012

Использование простого запроса SELECT - на мой взгляд - довольно надежно. Прежде всего он может проверять существование таблиц во многих различных типах баз данных (SQLite / MySQL).

SELECT 1 FROM table;

Имеет смысл, когда вы можете использовать другой надежный механизм для определения успешности запроса (например, вы запрашиваете базу данных через QSqlQuery в Qt ).

0 голосов
/ 01 июня 2019

Таблица существует или отсутствует в базе данных в swift

func tableExists(_ tableName:String) -> Bool {
        sqlStatement = "SELECT name FROM sqlite_master WHERE type='table' AND name='\(tableName)'"
        if sqlite3_prepare_v2(database, sqlStatement,-1, &compiledStatement, nil) == SQLITE_OK {
            if sqlite3_step(compiledStatement) == SQLITE_ROW {
                return true
            }
            else {
                return false
            }
        }
        else {
            return false
        }
            sqlite3_finalize(compiledStatement)
    }
0 голосов
/ 14 ноября 2018
class CPhoenixDatabase():
    def __init__(self, dbname):
        self.dbname = dbname
        self.conn = sqlite3.connect(dbname)

    def is_table(self, table_name):
        """ This method seems to be working now"""
        query = "SELECT name from sqlite_master WHERE type='table' AND name='{" + table_name + "}';"
        cursor = self.conn.execute(query)
        result = cursor.fetchone()
        if result == None:
            return False
        else:
            return True

Примечание: теперь это работает на моем Mac с Python 3.7.1

0 голосов
/ 11 июня 2017

Я думал, что вложу свои 2 цента в эту дискуссию, даже если она довольно старая .. Этот запрос возвращает скаляр 1, если таблица существует, и 0 в противном случае.

select 
    case when exists 
        (select 1 from sqlite_master WHERE type='table' and name = 'your_table') 
        then 1 
        else 0 
    end as TableExists
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...