import os import sqlite3 def CreateDBConfigTable(db_path='../src/db_ntfs_info.db', table_name='db_config'): """ 在指定路径下创建 SQLite 数据库,并在其中创建配置表。 :param db_path: str, 数据库文件的路径 :param table_name: str, 要创建的表名 :return: None """ # 确保目录存在 directory = os.path.dirname(db_path) if directory and not os.path.exists(directory): os.makedirs(directory) # 连接到SQLite数据库(如果文件不存在会自动创建) conn = sqlite3.connect(db_path) # 创建一个游标对象 cursor = conn.cursor() # 动态构建创建表的SQL语句 create_table_sql = f""" CREATE TABLE IF NOT EXISTS {table_name} ( ID INTEGER PRIMARY KEY AUTOINCREMENT, Key TEXT UNIQUE NOT NULL, Value TEXT NOT NULL ); """ # 执行SQL语句 cursor.execute(create_table_sql) # 提交更改 conn.commit() # 关闭连接 conn.close() print(f"表 [{table_name}] 已在数据库 [{db_path}] 中创建成功") def CreateDBDeviceTable(db_path='../src/db_ntfs_info.db', table_name='db_device'): """ 在指定路径下创建 SQLite 数据库,并在其中创建设备信息表。 :param db_path: str, 数据库文件的路径 :param table_name: str, 要创建的表名 :return: None """ # 确保目录存在 directory = os.path.dirname(db_path) if directory and not os.path.exists(directory): os.makedirs(directory) # 连接到SQLite数据库(如果文件不存在会自动创建) conn = sqlite3.connect(db_path) # 创建一个游标对象 cursor = conn.cursor() # 动态构建创建表的SQL语句 create_table_sql = f""" CREATE TABLE IF NOT EXISTS {table_name} ( ID INTEGER PRIMARY KEY AUTOINCREMENT, Path TEXT NOT NULL UNIQUE, -- 添加 UNIQUE 约束 Type TEXT NOT NULL CHECK(Type IN ('磁盘', '文件', '文件夹')), Option TEXT ); """ # 执行SQL语句 cursor.execute(create_table_sql) # 提交更改 conn.commit() # 关闭连接 conn.close() print(f"表 [{table_name}] 已在数据库 [{db_path}] 中创建成功") def CreateDBNodeTable(db_path='../src/db_ntfs_info.db', table_name='db_node'): """ 创建 NewDBNode 表,用于存储文件的具体属性和物理分布信息。 :param db_path: str, 数据库文件路径 :param table_name: str, 要创建的表名 :return: None """ # 确保目录存在 directory = os.path.dirname(db_path) if directory and not os.path.exists(directory): os.makedirs(directory) # 连接到SQLite数据库(如果文件不存在会自动创建) conn = sqlite3.connect(db_path) conn.execute("PRAGMA foreign_keys = ON;") # 开启外键支持 cursor = conn.cursor() # 动态构建创建表的SQL语句 create_table_sql = f""" CREATE TABLE IF NOT EXISTS {table_name} ( ID INTEGER PRIMARY KEY AUTOINCREMENT, PathID INTEGER NOT NULL, ExtendNameID INTEGER, GroupID INTEGER, UserID INTEGER, FileSize INTEGER, FileHash TEXT, ExtentCount INTEGER, extent1_DeviceID INTEGER, extent1_Location INTEGER, extent1_Length INTEGER, extent2_DeviceID INTEGER, extent2_Location INTEGER, extent2_Length INTEGER, extent3_DeviceID INTEGER, extent3_Location INTEGER, extent3_Length INTEGER, extent4_DeviceID INTEGER, extent4_Location INTEGER, extent4_Length INTEGER, -- 外键约束 FOREIGN KEY(PathID) REFERENCES NewDBPath(ID), FOREIGN KEY(ExtendNameID) REFERENCES db_extend(ID), FOREIGN KEY(GroupID) REFERENCES db_group(ID), FOREIGN KEY(UserID) REFERENCES db_user(ID) ); """ # 执行SQL语句 cursor.execute(create_table_sql) conn.commit() conn.close() print(f"表 [{table_name}] 已在数据库 [{db_path}] 中创建成功") def CreateDBUserTable(db_path='../src/db_ntfs_info.db', table_name='db_user'): """ 在指定路径下创建 SQLite 数据库,并在其中创建用户表。 :param db_path: str, 数据库文件的路径 :param table_name: str, 要创建的表名 :return: None """ # 确保目录存在 directory = os.path.dirname(db_path) if directory and not os.path.exists(directory): os.makedirs(directory) # 连接到SQLite数据库(如果文件不存在会自动创建) conn = sqlite3.connect(db_path) # 创建一个游标对象 cursor = conn.cursor() # 动态构建创建表的SQL语句 create_table_sql = f""" CREATE TABLE IF NOT EXISTS {table_name} ( ID INTEGER PRIMARY KEY AUTOINCREMENT, UserName TEXT UNIQUE NOT NULL ); """ # 执行SQL语句 cursor.execute(create_table_sql) # 提交更改 conn.commit() # 关闭连接 conn.close() print(f"表 [{table_name}] 已在数据库 [{db_path}] 中创建成功") def CreateDBGroupTable(db_path='../src/db_ntfs_info.db', table_name='db_group'): """ 在指定路径下创建 SQLite 数据库,并在其中创建组表。 :param db_path: str, 数据库文件的路径 :param table_name: str, 要创建的表名 :return: None """ # 确保目录存在 directory = os.path.dirname(db_path) if directory and not os.path.exists(directory): os.makedirs(directory) # 连接到SQLite数据库(如果文件不存在会自动创建) conn = sqlite3.connect(db_path) # 创建一个游标对象 cursor = conn.cursor() # 动态构建创建表的SQL语句 create_table_sql = f""" CREATE TABLE IF NOT EXISTS {table_name} ( ID INTEGER PRIMARY KEY AUTOINCREMENT, GroupName TEXT UNIQUE NOT NULL ); """ # 执行SQL语句 cursor.execute(create_table_sql) # 提交更改 conn.commit() # 关闭连接 conn.close() print(f"表 [{table_name}] 已在数据库 [{db_path}] 中创建成功") def CreateDBExtendSnippetTable(db_path='../src/db_ntfs_info.db', table_name='db_extend_extent'): """ 在指定路径下创建 SQLite 数据库,并在其中创建扩展片段表。 :param db_path: str, 数据库文件的路径 :param table_name: str, 要创建的表名 :return: None """ # 确保目录存在 directory = os.path.dirname(db_path) if directory and not os.path.exists(directory): os.makedirs(directory) # 连接到SQLite数据库(如果文件不存在会自动创建) conn = sqlite3.connect(db_path) cursor = conn.cursor() # 动态构建创建表的SQL语句 create_table_sql = f""" CREATE TABLE IF NOT EXISTS {table_name} ( ID INTEGER PRIMARY KEY AUTOINCREMENT, NodeID INTEGER NOT NULL, ExtentNumber INTEGER NOT NULL, extent_DeviceID INTEGER, extent_Location INTEGER, extent_Length INTEGER, -- 外键约束(可选) FOREIGN KEY(NodeID) REFERENCES db_node(ID) ); """ # 执行SQL语句 cursor.execute(create_table_sql) # 提交更改 conn.commit() conn.close() print(f"表 [{table_name}] 已在数据库 [{db_path}] 中创建成功") def CreateDBPathTable(db_path='../src/db_ntfs_info.db', table_name='db_path'): """ 创建 NewDBPath 表,用于存储文件/目录的路径信息。 :param db_path: str, 数据库文件路径 :param table_name: str, 要创建的表名 :return: None """ # 确保目录存在 directory = os.path.dirname(db_path) if directory and not os.path.exists(directory): os.makedirs(directory) # 连接到SQLite数据库(如果不存在会自动创建) conn = sqlite3.connect(db_path) conn.execute("PRAGMA foreign_keys = ON;") # 开启外键支持 cursor = conn.cursor() # 动态构建创建表的SQL语句 create_table_sql = f""" CREATE TABLE IF NOT EXISTS {table_name} ( ID INTEGER PRIMARY KEY AUTOINCREMENT, Path TEXT NOT NULL, Name TEXT NOT NULL, DirLayer INTEGER NOT NULL, PathHash TEXT UNIQUE NOT NULL, IsDir INTEGER NOT NULL CHECK(IsDir IN (0, 1)), ParentID INTEGER, ContentSize INTEGER, FileCreateTime TEXT, FileModifyTime TEXT, FileAccessTime TEXT, FileAuthTime TEXT, FileMode TEXT, -- 外键约束(可选) FOREIGN KEY(ParentID) REFERENCES {table_name}(ID) ); """ # 执行SQL语句 cursor.execute(create_table_sql) conn.commit() conn.close() print(f"表 [{table_name}] 已在数据库 [{db_path}] 中创建成功") def CreateDBExtendNameTable(db_path='../src/db_ntfs_info.db', table_name='db_extend_name'): """ 在指定路径下创建 SQLite 数据库,并在其中创建扩展名表。 :param db_path: str, 数据库文件的路径 :param table_name: str, 要创建的表名 :return: None """ # 确保目录存在 directory = os.path.dirname(db_path) if directory and not os.path.exists(directory): os.makedirs(directory) # 连接到SQLite数据库(如果文件不存在会自动创建) conn = sqlite3.connect(db_path) cursor = conn.cursor() # 动态构建创建表的SQL语句 create_table_sql = f""" CREATE TABLE IF NOT EXISTS {table_name} ( ID INTEGER PRIMARY KEY AUTOINCREMENT, ExtendName TEXT UNIQUE NOT NULL ); """ # 执行SQL语句 cursor.execute(create_table_sql) # 提交更改 conn.commit() conn.close() print(f"表 [{table_name}] 已在数据库 [{db_path}] 中创建成功") def main(): CreateDBDeviceTable(db_path='../src/db_ntfs_info.db', table_name='db_device') CreateDBConfigTable(db_path='../src/db_ntfs_info.db', table_name='db_config') CreateDBNodeTable(db_path='../src/db_ntfs_info.db', table_name='db_node') CreateDBUserTable(db_path='../src/db_ntfs_info.db', table_name='db_user') CreateDBGroupTable(db_path='../src/db_ntfs_info.db', table_name='db_group') CreateDBExtendSnippetTable(db_path='../src/db_ntfs_info.db', table_name='db_extend_extent') CreateDBPathTable(db_path='../src/db_ntfs_info.db', table_name='db_path') CreateDBExtendNameTable(db_path='../src/db_ntfs_info.db', table_name='db_extend_name') if __name__ == '__main__': main()