Не работает проверка существования таблицы sqlite
ДВС! У меня задача, проверить базу SQLite на существование таблицы. Везде рекомендуется способ:
conn = sqlite3.connect('mysqlite.db')
c = conn.cursor()
#get the count of tables with the name
c.execute(''' SELECT count(name) FROM sqlite_master WHERE type='table' AND name='students1' ''')
#if the count is 1, then table exists
if c.fetchone()[0]==1 :
print('Table exists.')
else :
print('Table does not exist.')
Но у меня он почему то не работает, а просто возникает исключение и код останавливается
Возникло исключение: OperationalError
no such column:students1
Средство самого sql: if not exists, мне не подойдет, так как и сам код питона будет отличаться при наличии таблицы. Подскажите, как это исправить? Спасибо!
Ответы (1 шт):
Исключение OperationalError возникает из-за того, что не получилось произвести запрос из базы данных по одной из двух причин:
- Из-за отсутствия таблицы - исключение
OperationalError: no such table - Из-за отсутствия столбца в таблице - исключение
OperationalError: no such column
В вашем коде (строка c.execute(...)) - это исключение не обрабатывается, поэтому приложение завершает свою работу с ошибкой.
Для корректного продолжения требуется отловить исключение при помощи конструкции try/except:
conn = sqlite3.connect('mysqlite.db')
c = conn.cursor()
try:
c.execute(''' SELECT count(name) FROM sqlite_master WHERE type='table' AND name='students1' ''')
data_list = c.fetchall()
except sqlite3.OperationalError:
print('Something goes wrong')
Задача: проверить базу SQLite на существование таблицы
Но этот код проверяет не только существование таблицы, но и существование столбца students1, что не соответствует условию задачи, поскольку при существовании таблицы, но отсутствии столбца students1, все равно будет вызвано исключение.
Для проверки существования только таблицы достаточно в вашем запросе убрать дополнительную фильтрацию по столбцу и тогда исключение OperationalError не будет возникать по другим причинам.
conn = sqlite3.connect('mysqlite.db')
c = conn.cursor()
try:
table_name = 'table'
c.execute(''' SELECT count(name) FROM sqlite_master WHERE type=table_name''')
data_list = c.fetchall()
except sqlite3.OperationalError:
print(f'Table {table_name} doesnt exist')