1

我正在临时文件夹中创建一个 sqlite 数据库。现在我想将该文件复制到另一个文件夹。是否有任何 sqlite 命令来重命名 sqlite 数据库文件?

我尝试在 C++ 中使用重命名函数,但它返回错误 18。错误 18 的意思是:“包含名称 newname 的目录必须与文件位于同一文件系统上(如名称 oldname 所示)”。

有人可以建议一个更好的方法来做到这一点。

4

2 回答 2

5

在正确的文件系统上使用临时目录!

首先,sqlite 数据库只是一个文件。可以随意移动或复制它,前提是:

  • 上次是正确关闭的,所以日志里没有东西可以回滚
  • 如果它使用预写日志类型的日志,则它是完全检查点的。

因此将其作为文件移动是正确的。现在有两种方法可以移动文件:

  • 使用rename系统调用。
  • 通过复制文件并删除旧文件。

前者有很多优点:它不能留下部分写入的文件,它不能留下两个文件,速度非常快,如果你用它来重命名旧文件,没有目标名称不会的句号t 存在(最后是 POSIX 语义,Windows 可以在 NTFS 上做到这一点,但不是 FAT 文件系统)。它还有一个重要的缺点:它只能在文件系统中工作。所以你必须:

  • 如果要重命名它以确保在进程失败的情况下不会留下部分写入的文件,则需要使用重命名,因此必须使用同一文件系统上的临时位置。通常这是通过在同一目录中使用不同的名称而不是使用临时目录来完成的。
  • 如果你重命名它是因为目的地可能很慢,例如因为你想把它放在网络共享上,你显然想在不同的文件系统上使用临时目录。这意味着您必须读取文件并以新名称写入。标准 C 或 C++ 库中没有此功能,但许多库都会有一个(而像 python 这样的高级语言也会有一个,你可以随时执行/bin/mv来为你做这件事)。
于 2012-09-05T06:48:32.377 回答
0

现在我想将该文件复制到另一个文件夹。是否有任何 sqlite 命令来重命名 sqlite 数据库文件?

关闭数据库。使用 shell 将数据库复制到新路径。

另请参阅SQLite 的独特功能

稳定的跨平台数据库文件

SQLite 文件格式是跨平台的。在一台机器上编写的数据库文件可以复制到具有不同架构的不同机器上并在其上使用。大端或小端,32 位或 64 位无关紧要。所有机器都使用相同的文件格式。此外,开发人员承诺保持文件格式稳定和向后兼容,因此新版本的 SQLite 可以读取和写入旧数据库文件。

大多数其他 SQL 数据库引擎要求您在从一个平台移动到另一个平台时转储和恢复数据库,并且通常在升级到较新版本的软件时。

于 2019-04-10T13:01:28.243 回答