我想用Python表示Sqlite数据库中的文件夹结构,其中每个表的行为均与其自身的文件夹相同,并且可以是另一个的父,子或同级。
我当前的设置中,它们嵌套有定界符,如下所示:
但是,当我从数据库中读取信息时,我不知道如何用python表示此嵌套,因为简单地嵌套列表是行不通的,因为那样将无法保留文件夹的名称,它将只显示嵌套在其中的事物。
我应该怎么做a)将表存储在数据库中b)用Python表示表的结构?
答案 0 :(得分:0)
最好将文件夹结构存储在单个表中,而不是为每个文件夹创建一个表。
例如,这样的表可以具有如下结构:
╔═══════════╦══════╦══════════════════════════════════╗
║ Column ║ Type ║ Description ║
╠═══════════╬══════╬══════════════════════════════════╣
║ id ║ int ║ Unique identifier of the folder ║
║ parent_id ║ int ║ id of the parent folder ║
║ name ║ text ║ Name of the folder ║
║ mpath ║ text ║ Materialized path of parent id's ║
╚═══════════╩══════╩══════════════════════════════════╝
关于物化路径的注意事项:它是可选的,可以添加它以使其更快地运行诸如“获取文件夹123的所有子项”之类的查询,而无需重新调用。
因此,让我们假设您具有以下文件夹结构:
/
├── home/
│ ├── aspiring-master
│ │ └── .bashrc
│ └── guest-user
└── var/
├── log/
└── lib/
它可以以上述表格的形式呈现:
╔════╦═══════════╦═══════════════════╦═══════════╗
║ id ║ parent_id ║ name ║ mpath ║
╠════╬═══════════╬═══════════════════╬═══════════╣
║ 1 ║ null ║ "/" ║ "/" ║
║ 2 ║ 1 ║ "home" ║ "/1/" ║
║ 3 ║ 2 ║ "aspiring-master" ║ "/1/2/" ║
║ 4 ║ 3 ║ ".bashrc" ║ "/1/2/3/" ║
║ 5 ║ 2 ║ "guest-user" ║ "/1/2/" ║
║ 6 ║ 1 ║ "var" ║ "/1/" ║
║ 7 ║ 6 ║ "log" ║ "/1/6/" ║
║ 8 ║ 6 ║ "lib" ║ "/1/6/" ║
╚════╩═══════════╩═══════════════════╩═══════════╝
在python中,您可以使用一些ORM,例如sqlAlchemy,在这种情况下,您的文件夹将被表示为一个类,实现了Model:
class Folder(db.Model):
id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey('folder.id'),
nullable=True)
name = db.Column(db.String(128), unique=True, nullable=False)
mpath = db.Column(db.String(255), unique=True, nullable=False)
自动创建mpath值的功能也可以放在此类中。