Как проверить, существует ли таблица?
Я работаю над программой 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