sqlite файл базы данных нечитаемые символы - PullRequest
0 голосов
/ 09 февраля 2019

У нас есть задание, в котором мы должны писать и запрашивать файл базы данных напрямую, без использования каких-либо функций API sqlite.Нам дали сайт https://www.sqlite.org/fileformat.html в качестве руководства, но я не могу заставить файл базы данных выглядеть как что-либо читабельное.

Вот базовый пример того, что я пытаюсь сделать сБиблиотека sqlite3 из python

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 3», а затем за ним следует куча странных символов.То же самое произошло, когда я сделал базу данных с фактическим данным CSV-файла.Есть некоторые читаемые части, но большинство из них - нечитаемые символы, которые никоим образом не похожи на формат, указанный на сайте.Я сейчас немного ошеломлен, поэтому я был бы признателен, если бы кто-нибудь указал мне правильное направление, как я начал бы исправлять этот беспорядок.

1 Ответ

0 голосов
/ 09 февраля 2019

Вот пример чтения этого двоичного файла с использованием FileIO и struct:

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)

Это только читает заголовок базы данных и игнорирует большинство значений в заголовке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...