【问题标题】:How to verify that my sqlite3 database is version 3.25?如何验证我的 sqlite3 数据库是 3.25 版?
【发布时间】:2020-05-03 20:43:25
【问题描述】:

我使用从https://www.sqlite.org/download.html下载的最新的 sqlite3.exe v3.25 工具创建了一个新的 sqlite3 数据库

我想验证创建的 sqlite 数据库是 v3.25 以利用最新功能。

如何使用 sqlite3.exe 工具验证版本是否为 v3.25?我欢迎其他方式这样做。

我在这里尝试了投票最多的答案; How to find SQLITE database file version

但是,答案无济于事。它返回库版本,而不是数据库文件版本。

我使用的是 Windows 10。

【问题讨论】:

  • sqlite3 程序在启动时打印出包含版本的横幅消息。
  • 数据库文件本身有版本,但格式几年没变。默认情况下使用当前版本,除非您在新数据库中创建任何表之前使用 pragma 更改它。
  • 工具。您可以使用legacy_file_format pragma 找到文件版本,除非您正在处理使用 3.7.10 之前的 sqlite 版本创建的数据库,否则它可能会返回 4,在这种情况下它可能是 1 (或者可能是 2 或 3)。 Details
  • 我突然意识到,您可能认为用于创建数据库的 sqlite 版本会影响以后可以使用该文件的版本。只要该 sqlite 版本可以读取文件版本(1-4),它就不会(需要注意的是,具有 WITHOUT ROWID 表的数据库需要 3.8.2 或更高版本;该功能是在没有碰撞的情况下添加的无论出于何种原因,文件格式)。
  • 是的,它必须使用 3.25 或更高版本。如果与 python 捆绑的版本已经更新发布,我会感到惊讶。

标签: database sqlite


【解决方案1】:

根据the official specification of the database format,在数据库文件的开头有一个标题,跨越前 100 个字节。 标题中有几项包含版本号:

Offset  Size    Description 
18      1       File format write version. 1 for legacy; 2 for WAL. 
19      1       File format read version. 1 for legacy; 2 for WAL. 
60      4       The "user version" as read and set by the user_version pragma.
92      4       The version-valid-for number.
96      4       SQLITE_VERSION_NUMBER

根据您的问题,您似乎想获得SQLITE_VERSION_NUMBER。 那实际上不是“数据库版本”(也没有这种东西),而是value for the SQLite library that most recently modified the database file

要获得该值,您只需阅读the 4-byte big-endian integer at offset 96。 为此,您可以使用 python 代码here(“我欢迎其他方式这样做。)。 我尝试使用包含这些行的 python 代码创建一个数据库

import sqlite3
print('sqlite3 sqlite_version: ', sqlite3.sqlite_version)
(... create database ...)

打印出来的

sqlite3 sqlite_version:  3.31.1

然后使用链接代码读取数据库标题。 特别是线条

sqlite_version_number = unpack('>i', header[96:])[0]
print('SQLITE_VERSION_NUMBER: ' + str(sqlite_version_number))

印刷

SQLITE_VERSION_NUMBER: 3031001

确认“数据库版本号”的正确阅读(出于上述原因,在引号之间)。

注意事项:

  1. 只要您有可用的 python,这将在 Windows 和 Linux 中运行。

  2. 您可以找到其他阅读标题的方法。关键是确定在哪里可以找到您需要的信息。

    2.1。方镁石。我找不到显示所需信息的命令。

    2.2。 Linux。 dd 可以为您完成这项工作。

    2.3。电源外壳。 [System.IO.File]Get-Content 可能会有所帮助。我没有进一步探索。

【讨论】:

    猜你喜欢
    • 2013-06-21
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2012-06-29
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    相关资源
    最近更新 更多