python sqlite“如果不存在则创建表”问题

时间:2011-04-27 08:16:13

标签: 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

此时该表不存在(由于某种原因),因此下次运行脚本时不会发生错误。基本上,如果我继续运行测试脚本,那么每次其他运行都会导致错误,我很难理解为什么 - 但我已经确定在不使用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 个答案:

答案 0 :(得分:33)

我可以使用以下简化脚本复制该问题:

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

不确定原因是什么。


2018年10月16日更新

从2.7.12开始,此问题不再可重现,但我没有在更改日志中看到它。如果您仍然看到它,请先尝试更新您的python版本。

答案 1 :(得分:0)

  

我尝试了完全相同的程序   只有成功完全没有问题   将位置更改为:memory:

编辑: 尝试完全相同的代码,也没有任何问题。

供参考:

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

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

也许你应该仔细检查文件data的可写性?