如何在Sqlite数据库中表示嵌套的文件夹和子文件夹结构?

时间:2019-02-07 03:39:00

标签: python database sqlite

我想用Python表示Sqlite数据库中的文件夹结构,其中每个表的行为均与其自身的文件夹相同,并且可以是另一个的父,子或同级。

我当前的设置中,它们嵌套有定界符,如下所示:

  • ['folder :: subfoldera']
  • ['folder :: subfolderb']
  • ['folder2 :: subfolderc']
  • ['folder2 :: subfolderd']
  • ['last :: example :: to :: represent :: depth']

但是,当我从数据库中读取信息时,我不知道如何用python表示此嵌套,因为简单地嵌套列表是行不通的,因为那样将无法保留文件夹的名称,它将只显示嵌套在其中的事物。

我应该怎么做a)将表存储在数据库中b)用Python表示表的结构?

1 个答案:

答案 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值的功能也可以放在此类中。