Python sqlite "создать таблицу, если не существует" проблема - PullRequest
20 голосов
/ 27 апреля 2011

У меня проблема с использованием 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

На данный момент таблица не существует (по какой-то причине), поэтому при следующем запуске сценария ошибок не будет. По сути, если я продолжу запускать тестовый сценарий, то точно каждый следующий запуск приведет к ошибке, и я озадачен, почему - но я решил, что создание базы данных без использования if not exists решает проблему. Я до сих пор не знаю, в чем заключается первоначальная проблема, и я был бы признателен, если бы кто-нибудь мог указать мне правильное направление. Тестовый скрипт, демонстрирующий проблему ниже:

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()

Заранее спасибо:)

Ответы [ 2 ]

33 голосов
/ 27 апреля 2011

Я могу продублировать проблему с помощью следующего упрощенного сценария:

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()

Чтобы это исправить, вы должны закрыть и повторно подключиться к БД после создания или удаления таблицы, т. Е. Добавить следующий код между ними:

c.close()
conn.close()
conn = sqlite3.connect(location)
c = conn.cursor()

Не знаю, в чем причина.


Обновление от 16 октября 2018

Начиная с 2.7.12, эта проблема больше не воспроизводится, хотя я не вижу ее упомянутой в журнале изменений. Если вы все еще видите его, попробуйте сначала обновить версию Python.

0 голосов
/ 27 апреля 2011

Я попробовал точно такую ​​же программу, но все без проблем, только изменив местоположение на :memory:

РЕДАКТИРОВАТЬ: попробовал точно такой же код и вообще никаких проблем,тоже.

К вашему сведению:

felix@felix-arch ~ $ python2 --version
Python 2.7.1

felix@felix-arch ~ $ sqlite3 --version
3.7.6.1

Возможно, вам следует дважды проверить возможность записи файла data?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...