Проблема python sqlite "создать таблицу, если она не существует"
У меня возникла проблема с использованием sqlite для создания таблицы, только если она не существует. В принципе, у меня есть таблица, которую я бросаю и переделываю один раз в течение долгого времени. Однако, если таблица уже существовала (прежде чем я ее сброшу и переделаю), я получаю следующую ошибку при попытке вставить в первый раз:
Traceback (most recent call last):
File "test.py", line 40, in <module>
remake()
File "test.py", line 31, in remake
insert_record(1)
File "test.py", line 36, in insert_record
c.execute(sql)
sqlite3.OperationalError: no such table: table_name
В этот момент таблица не существует (по какой-то причине), поэтому при следующем запуске script ошибок не возникает. В принципе, если я продолжу выполнение теста script, то точно каждый другой запуск приведет к ошибке, и я не понимаю, почему, но я решил, что создание базы данных без использования if not exists
устраняет проблему. Я до сих пор не знаю, какова первоначальная проблема, и я был бы признателен, если бы кто-нибудь мог указать мне в правильном направлении. Тест script демонстрирует проблему ниже:
import sqlite3
location = 'data'
table_name = 'table_name'
def init():
global conn
global c
conn = sqlite3.connect(location)
c = conn.cursor()
create_database()
def create_database():
sql = 'create table if not exists ' + table_name + ' (id integer)'
c.execute(sql)
conn.commit()
def create_database2():
sql = 'create table ' + table_name + '(id integer)'
c.execute(sql)
conn.commit()
def clear_database():
sql = 'drop table ' + table_name
c.execute(sql)
conn.commit()
def remake():
clear_database()
create_database() # Replacing this with create_database2() works every time
insert_record(1)
conn.commit()
def insert_record(id):
sql = 'insert into ' + table_name + ' (id) values (%d)' % (id)
c.execute(sql)
print 'Inserted ', id
init()
remake()
Заранее спасибо:)
Ответы
Ответ 1
Я могу дублировать проблему со следующим упрощенным script:
import sqlite3
location = 'data'
table_name = 'table_name'
conn = sqlite3.connect(location)
c = conn.cursor()
sql = 'create table if not exists ' + table_name + ' (id integer)'
c.execute(sql)
sql = 'drop table ' + table_name
c.execute(sql)
sql = 'create table if not exists ' + table_name + ' (id integer)'
c.execute(sql)
sql = 'insert into ' + table_name + ' (id) values (%d)' % (1)
c.execute(sql)
conn.commit()
Чтобы исправить это, вы должны закрыть и снова подключиться к db после создания или удаления таблицы, т.е. добавить следующий код между ними:
c.close()
conn.close()
conn = sqlite3.connect(location)
c = conn.cursor()
Не уверен, в чем причина.
Ответ 2
Я пробовал точно такую же программу и преуспел без каких-либо проблем, только изменение местоположения на :memory:
EDIT:
пробовал точно такой же код и вообще не проблема.
FYI:
[email protected] ~ $ python2 --version
Python 2.7.1
[email protected] ~ $ sqlite3 --version
3.7.6.1
Возможно, вам стоит дважды проверить возможность записи файла data
?