sqlite数据库文件不可读符号

时间:2019-02-09 01:37:05

标签: python database sqlite

我们有一项任务,我们必须直接从数据库文件编写和查询,而无需使用任何sqlite api函数。我们以站点https://www.sqlite.org/fileformat.html为指导,但是我似乎无法使数据库文件看起来像任何可读的东西。

这是我要使用python的sqlite3库进行操作的基本示例

import sqlite3

con = sqlite3.connect("test.db")
cur = con.cursor()

cur.execute("PRAGMA page_size = 4096")
cur.execute("PRAGMA encoding = 'UTF-8'")
dropTable = "DROP TABLE IF EXISTS Employee"
createTable = "CREATE TABLE Employee(first int, second int, third int)"

cur.execute(dropTable)
cur.execute(createTable)

cur.execute("INSERT INTO Employee VALUES (1, 2, 3)")

con.commit()
con.close()

当我打开数据库文件时,它以“ SQLite format 3”开头,然后是一堆奇怪的符号。当我使用给定的实际csv文件制作数据库时,发生了同样的事情。有一些可读的部分,但大多数是不可读的符号,与网站指定的格式完全没有相似之处。我现在有点不知所措,所以我将不胜感激,有人向我指出了有关如何开始修复此混乱局面的正确方向。

1 个答案:

答案 0 :(得分:1)

以下是使用FileIOstruct读取二进制文件的示例:

from io import FileIO
from struct import *


def read_header(db):
    # read the entire database header into one bytearray
    header = bytearray(100)
    db.readinto(header)

    # print out a few of the values in the header
    # any number that is more than one byte requires unpacking
    # strings require decoding
    print('header string: ' + header[0:15].decode('utf-8')) # note that this ignores the null byte at header[15]
    page_size = unpack('>h', header[16:18])[0]
    print('page_size = ' + str(page_size))
    print('write version: ' + str(header[18]))
    print('read version: ' + str(header[19]))
    print('reserved space: ' + str(header[20]))
    print('Maximum embedded payload fraction: ' + str(header[21]))
    print('Minimum embedded payload fraction: ' + str(header[22]))
    print('Leaf payload fraction: ' + str(header[23]))
    file_change_counter = unpack('>i', header[24:28])[0]
    print('File change counter: ' + str(file_change_counter))
    sqlite_version_number = unpack('>i', header[96:])[0]
    print('SQLITE_VERSION_NUMBER: ' + str(sqlite_version_number))


db = FileIO('test.db', mode='r')
read_header(db)

这仅读取数据库标头,并且忽略标头中的大多数值。