Не работает проверка существования таблицы 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 возникает из-за того, что не получилось произвести запрос из базы данных по одной из двух причин:

  1. Из-за отсутствия таблицы - исключение OperationalError: no such table
  2. Из-за отсутствия столбца в таблице - исключение 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')
→ Ссылка