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 我偶尔会遇到以下错误:sqlite3.OPERNATIONAL错误:无法打开数据库文件_Python_Sqlite - Fatal编程技术网

Python 我偶尔会遇到以下错误:sqlite3.OPERNATIONAL错误:无法打开数据库文件

Python 我偶尔会遇到以下错误:sqlite3.OPERNATIONAL错误:无法打开数据库文件,python,sqlite,Python,Sqlite,这在Python2.6.6、sqlite3中发生。 我有一个使用sqlite的db类。下面是其init的一部分 def _init_db(self): "init the database tables and indices" print '\n'.join(DROP_TABLES[0:1]) print '\n'.join(CREATE_TABLES[0:1]) print '\n'.join(CREATE_INDEXES[0:1]) print '\n'.j

这在Python2.6.6、sqlite3中发生。 我有一个使用sqlite的db类。下面是其init的一部分

def _init_db(self):
"init the database tables and indices"
    print '\n'.join(DROP_TABLES[0:1])
    print '\n'.join(CREATE_TABLES[0:1])
    print '\n'.join(CREATE_INDEXES[0:1])
    print '\n'.join(CREATE_TRIGGERS[0:1])
    for query in DROP_TABLES:
       self.connection.execute(query)
#   self.connection.commit()
    for query in CREATE_TABLES:
       self.connection.execute(query)
#   self.connection.commit()        
    for query in CREATE_INDEXES:
       self.connection.execute(query)
#   self.connection.commit()
    for query in CREATE_TRIGGERS:
       self.connection.execute(query)            
    self.connection.commit()
这是查询的打印输出。(我认为这不太重要,这里是为了完整性)

我得到sqlite3.OperationalError:无法在self.connection.execute行之一上打开数据库文件。有时是第三次或第四次(在我的程序的其他地方也会发生)

我在windows上工作。我不知道为什么会这样,我做错了什么。 如有任何建议,我们将不胜感激

更多信息(由于提出的问题): -我没有使用并发访问。没有线或类似的东西


编辑-更多信息:我在所有连接上都添加了定时重试。执行命令行时,它通常会失败一两次,然后正常工作。我猜想,当execute命令返回时,数据可能没有实际写入磁盘。

SQLite不适合并发访问。如果有多个线程或进程访问同一个数据库文件,就会遇到这个问题。

我的直觉告诉我,文件系统中肯定有可疑的东西,而不是软件中。也许是其中之一:

  • 备份脚本正在临时移动/重命名文件或父文件夹
  • 文件系统看起来是“本地”的,但实际上是一个SAN,并且存在一些间歇性问题
  • 其他面向文件系统的内核模块,如透明加密,正在干扰SQLite系统调用
  • 入侵检测软件正在干扰SQLite系统调用
  • 另一个用户在您不知情的情况下打开文件进行读取
  • 这是一种病毒
    :-)

    • 并发访问回答帮助我解决了问题。我的解决方案基本上是从并发访问发生()之前恢复到以前未损坏的db文件。

      我不确定这些选项中的任何一个都很可能,但可能我错了。你知道这些对于一个简单的家庭Windows7来说是否合理吗?如果sqlite可以内置一些重试机制之类的东西,那就太好了。无论如何,谢谢你的评论
      DROP TABLE IF EXISTS graph_T 
      
      CREATE TABLE IF NOT EXISTS graph_T
      (v1 int,
      v2 int,
      step_start int,
      step_end int DEFAULT 2147483647,
      value int DEFAULT 1,
      path_kind int DEFAULT 0,
      path_id long,
      partial_path_id long) 
      
      CREATE INDEX IF NOT EXISTS idxgraph_T
                ON graph_T(v1,v2)
      
      CREATE TRIGGER IF NOT EXISTS trig_graph_T_path_id
      AFTER INSERT ON graph_T
      BEGIN
      UPDATE graph_T SET 
      path_id = (10000 * 10000 * max(new.v1, new.v2) + 
          10000 * min(new.v1, new.v2) + 0 ) ,
      partial_path_id = 10000 * 10000 * max(new.v1, new.v2) + 
          10000 * min(new.v1, new.v2)
      WHERE rowid = new.rowid;
      END;