Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python sqlite“;创建表(如果不存在)";问题_Python_Sqlite - Fatal编程技术网

python sqlite“;创建表(如果不存在)";问题

python sqlite“;创建表(如果不存在)";问题,python,sqlite,Python,Sqlite,我在使用sqlite创建表时遇到了一个问题,如果它不存在的话。基本上,我有一张桌子,每隔很长一段时间我就会把它扔下来重新制作一次。但是,如果表已经存在(在我删除并重新生成它之前),那么在第一次尝试插入时会出现以下错误: Traceback (most recent call last): File "test.py", line 40, in <module> remake() File "test.py", line 31, in remake insert

我在使用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
提前感谢:)

我尝试了完全相同的程序 成功了,一点问题也没有,只是 将位置更改为
:内存:

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

供参考:


也许您应该仔细检查文件
数据的可写性

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

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()
但不确定原因是什么


更新日期:2018年10月16日


从2.7.12开始,这个问题不再是可复制的,尽管我在变更日志中没有看到它。如果您仍然看到它,请先尝试更新python版本。

问题是可重复的。尝试不使用:内存:好的,现在我尝试将位置更改为
数据
,并尝试了一次又一次,完全没有问题,输出仍然:
插入1
我认为您运行了问题中提到的脚本两次?好的,我确实遇到了与描述相同的问题。我会看看我是否可以简化,看看问题出在哪里,谢谢你的检查。我目前正在运行Python 2.6.5和sqlite3.6.22,尽管我的sqlite3.version在Python中是2.4.1,sqlite3.sqlite_版本是3.6.22。我也在Python3中尝试过这个方法,得到了相同的结果。使
数据
世界可写也没有帮助。对于简单的脚本和解决方案+1。我试着在sqlite控制台中键入这些语句,这样就可以了。我只是想知道这应该是pysqlite library.btw的一个bug,运行DDL后不需要提交,这些语句不会在事务中运行。我刚刚遇到了一个非常类似的问题,关闭并在代码中重新创建连接就解决了这个问题。谢谢你们两位。但奇怪的是,这种情况正在发生。我最好的猜测是它是sqlLite中的一个bug。SQL的结尾应该有分号吗?只是想知道。
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()