【问题标题】:How to reseve space at the end of each page in SQLite database如何在 SQLite 数据库中每页的末尾保留空间
【发布时间】:2017-09-27 16:11:39
【问题描述】:

我正在尝试使用pysqlsimplecipher 加密 SQLite3 数据库。当我尝试加密它时,它给出了一个错误:

raise RuntimeError('needs reserved space at the end of each page.')
RuntimeError: needs reserved space at the end of each page.

我不知道该怎么做。我正在使用用于 sqlite 的数据库浏览器。是否有任何我应该执行的 SQL 语句,我应该在 DB 浏览器中更改的任何设置或其 SQLite 模块中的任何 python 函数以在每个页面的末尾保留空间?多少空间就足够了?

或任何解决方法?它是较大程序的一部分,所以这里的限制是我应该使用 python 来加密。但是,我可以使用任何方法来保留空间,因为它只需要完成一次。

我的平台是 windows 8.1,python 版本是 3.6 x32。如果这很重要。

我问的是一种 pythonic 方式或一个 SQL 语句来做到这一点。 我已经找到了answer using c++,但那是在 C++ 中的。我对c++了解不多 我读过你必须编译 sqlite 才能与 c++ 一起使用。我不知道。如果有人发布整个代码 sn-p 以使用 c++ 来完成,我将不胜感激。

【问题讨论】:

  • 不,答案是关于 c/c++ :sqlite3_test_control(SQLITE_TESTCTRL_RESERVE, sqlite3 *db, int N) 我问的是 SQL 或 pythonic 方式。
  • sqlite3_test_control 函数只能用于 数据库。无论如何,您可以使用 ctypes 模块从 python 调用它。
  • 谢谢你。请澄清“空”;我应该删除元组或整个表(创建新数据库)?
  • “空”是指一个新数据库。您将需要使用ctypes 来创建新数据库,因此您可以获得指向它的指针,该指针可以传递给sqlite3_test_control 函数(即sqlite3 *db 参数)。在此之后,您可以使用任何您喜欢的方法将所有数据从旧数据库传输到新数据库。如果你用谷歌搜索“ctypes sqlite3”,你应该会找到很多示例代码来帮助你入门(例如this SO question)。

标签: python python-3.x sqlite


【解决方案1】:

你链接到的documentation 说:

需要在数据库文件的每一页末尾保留空间。

否则,使用sqlcipher加密。

使用 sqlcipher 加密

  • 打开普通数据库

    ./sqlcipher plain.db
    
  • 加密到 enc.db

    ATTACH DATABASE 'enc.db' as encrypted key 'testkey';
    SELECT sqlcipher_export('encrypted');
    DETACH DATABASE encrypted;
    

【讨论】:

    【解决方案2】:

    所以经过几天的研究和尝试大量的方法。我成功地做到了。 sqlite3_test_control(SQLITE_TESTCTRL_RESERVE, sqlite3 *db, int N) 方法不再起作用。所以我使用了一个 HEX 编辑器来更改用于指示在 sqlite 数据库中每个页面的末尾要保留多少空间的特定字节。来了:

    1- 创建一个空数据库:不要创建任何表或任何东西。创建并保存一个 sqlite 数据库文件。

    2- 使用十六进制编辑器更改偏移量 20 处的字节。它将是 00,这意味着没有保留字节。例如,如果你想保留 36 个字节。将偏移量 20 处的字节值更改为“24”(转换为 HEX 时为 36)。

    3-检查偏移量105和106的字节。它们的值表示内容区域的起始位置。如果保留空间为 0,则该值将是页面大小。 例如,在这种情况下,它的 0400 是十进制的 1024。现在减去您之前设置保留的字节; 36. 1024-36 = 988。在十六进制中它的 03DC。 将 105 和 106 偏移处的值设置为 03DC。保存它,现在你可以开始了。 检查image,我已经在编辑器的相关字节和设置下划线了。

    我需要使用pysqlsimplecipher 对数据库进行加密和解密,这需要在每页末尾保留一些字节。 希望它可以帮助某人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      相关资源
      最近更新 更多