设置sqlite临时存储目录


问题内容

我有一个使用SQLite作为其后端数据库的Python二进制文件。SQLite的文档和代码建议设置以下三个环境变量中的任何一个都可以工作:

export TMP=/var/tmp/sqlite/
export TEMP=/var/tmp/sqlite/
export TEMPDIR=/var/tmp/sqlite/

如果在刚启动Python二进制文件之前将上述变量导出到bash脚本中,则无济于事。

我尝试的另一个选项是putenv()通过设置来调用os.environ

os.environ['TMP'] = /var/tmp/sqlite/
os.environ['TEMP'] = /var/tmp/sqlite/
os.environ['TEMPDIR'] = /var/tmp/sqlite/

以上选项均无法帮助说服SQLite/var/tmp/sqlite用作其临时存储目录。起作用的唯一选项(不推荐使用SQLite的文档说)是设置temp_store_directorypragma语句:

PRAGMA temp_store_directory = '/egnyte/.work/sqlite_temp'

由于我不希望使用pragma语句,因此还有其他技巧吗?


问题答案:

您所指的环境变量确实是sqlite所要查找的内容,但在Windows中而不是UNIX中。

在Unix中,您需要设置的环境变量TMPDIR如源代码所示:

static const char *unixTempFileDir(void){
  static const char *azDirs[] = {
     0,
     0,
     "/var/tmp",
     "/usr/tmp",
     "/tmp",
     0        /* List terminator */
  };
  unsigned int i;
  struct stat buf;
  const char *zDir = 0;

  azDirs[0] = sqlite3_temp_directory;
  if( !azDirs[1] ) azDirs[1] = getenv("TMPDIR");
  for(i=0; i<sizeof(azDirs)/sizeof(azDirs[0]); zDir=azDirs[i++]){
    if( zDir==0 ) continue;
    if( osStat(zDir, &buf) ) continue;
    if( !S_ISDIR(buf.st_mode) ) continue;
    if( osAccess(zDir, 07) ) continue;
    break;
  }
  return zDir;
}