Как проверить, существует ли таблица?

Я работаю над программой scrabblecheat

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

Однако он говорит мне, что я не могу воссоздать таблицу базы данных.

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

Ошибка:

(<class 'sqlite3.OperationalError'>, OperationalError('table spwords already exists',), None)

Код:

def load_db(data_list):

# create database/connection string/table
conn = sqlite.connect("sowpods.db")

#cursor = conn.cursor()
# create a table
tb_create = """CREATE TABLE spwords
                (sp_word text, word_len int, word_alpha text, word_score int)
                """
conn.execute(tb_create)  # <- error happens here
conn.commit()

# Fill the table
conn.executemany("insert into spwords(sp_word, word_len, word_alpha, word_score) values (?,?,?,?)",  data_list)
conn.commit()

# Print the table contents
for row in conn.execute("select sp_word, word_len, word_alpha, word_score from spwords"):
    print (row)

if conn:
    conn.close()

Ответ 1

Запрос, который вы ищете, это:

SELECT name FROM sqlite_master WHERE type='table' AND name='spwords'

Итак, код должен выглядеть следующим образом:

tb_exists = "SELECT name FROM sqlite_master WHERE type='table' AND name='spwords'"
if not conn.execute(tb_exists).fetchone():
    conn.execute(tb_create)

Удобной альтернативой SQLite 3.3+ является использование более интеллектуального запроса для создания таблиц:

CREATE TABLE IF NOT EXISTS spwords (sp_word text, word_len int, word_alpha text, word_score int)

Из документации:

Обычно возникает ошибка при попытке создать новую таблицу в базе данных, которая уже содержит таблицу, индекс или представление с тем же именем. Однако, если предложение "IF NOT EXISTS" указано как часть оператора CREATE TABLE, и таблица или представление с тем же именем уже существуют, команда CREATE TABLE просто не имеет эффекта (и сообщение об ошибке не возвращается). Ошибка по-прежнему возвращается, если таблица не может быть создана из-за существующего индекса, даже если указано предложение "ЕСЛИ НЕ СУЩЕСТВУЕТ".

Ответ 2

conn = sqlite3.connect('sowpods.db')
curs = conn.cursor()
try:
    curs.execute('''CREATE TABLE spwords(sp_word TEXT, word_len INT, word_alpha TEXT,word_score INT)''')
    conn.commit()
except OperationalError: 
    None

https://docs.python.org/2/tutorial/errors.html

Я считаю, что если он уже существует, вы можете просто пропустить ошибку и перейти непосредственно к вставке данных

Ответ 3

Я не поклонник отказов CREATE от подхода к базе данных. Вы должны знать, существует ли таблица, чтобы могла начаться первая инициализация.

Вот один и тот же запрос на основе запроса, но на основе функций общего назначения:

def getTables(conn):
   """
   Get a list of all tables
   """
   cursor = conn.cursor()
   cmd = "SELECT name FROM sqlite_master WHERE type='table'"
   cursor.execute(cmd)
   names = [row[0] for row in cursor.fetchall()]
   return names

def isTable(conn, nameTbl):
   """
   Determine if a table exists
   """
   return (nameTbl in getTables(conn))

Теперь верхний код

if not(isTable(conn, 'spwords')):
    # create table and other 1st time initialization