我们有一项任务,我们必须直接从数据库文件编写和查询,而无需使用任何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文件制作数据库时,发生了同样的事情。有一些可读的部分,但大多数是不可读的符号,与网站指定的格式完全没有相似之处。我现在有点不知所措,所以我将不胜感激,有人向我指出了有关如何开始修复此混乱局面的正确方向。
答案 0 :(得分:1)
以下是使用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)
这仅读取数据库标头,并且忽略标头中的大多数值。