如何将 python flask 应用程序中的 windows 文件夹与 sqlite 数据库 table 同步?

How to synchronize a windows folder in python flask app with a sqlite database table?

我正在寻找一种解决方案,用于将 sqlite 数据库中的文件名与 windows 目录中的文件名进行比较 (app.config['UPLOAD_FOLDER'])。

我有一个 sqlite 数据库,其中有一个名为“文件”的 table,其中包含我文件中的所有数据。

file 定义为:files = [file.to_displayable_dict() for file in File.query if is_file_visible(file)] 这是函数:

def to_displayable_dict(self):
        return {
            "Dateiname" : "<div class=hasTooltip> <a href=/download/" + self.name + ">" + self.name + "</a> <span>" + self.beschreibung + "</span></div>",
            "Kategorie" : self.kategorie,
            "Bezeichnung" : self.bezeichnung,
            "TV" : self.tv,
            "Stand" : self.stand,
            "Upload-Benutzer" : self.uploadbenutzer,
            "Vertraulichkeitsstufen" : self.Vertraulichkeitsstufen
            }

在 sqlite table 文件中,如果我打印 ("Files:", files) LOOK 添加了其他评论,我就有这种数据。

如果我进入我的 windows 实例文件夹 (app.config['UPLOAD_FOLDER']) 并删除文件 (Dateiname: EPEX_SPOTPRICE_STROM),它应该会自动删除文件在我的 database.db.

的文件 table 中

对于解决方案,必须比较 WIndows 目录中的文件名和 table 文件中的文件名。

因为href,我不知道如何进行比较。我的想法是,但不起作用。 Post 对路由的操作不是一个好的解决方案。

something like get_files = os.listdir(app.config['UPLOAD_FOLDER'])
for file in Files.query():
if file.filename not in files_in_folder:
db.session.delete(file.filename)
db.session.commit()
flash (data was deleted )

在 python 烧瓶下你会怎么做?对自己的代码示例有什么建议吗?谢谢!

我试着绕过这个:

import os
path = r"C:/Users/add706/Documents/NRL_webseite/instance/uploads"

def get_files(path):
    for file in os.listdir(path):
        if os.path.isfile(os.path.join(path, file)):
            yield file  
for file in get_files(path):
    print("file:", file)

该文件的输出:EPEX_SPOTPRICE_STROM.docx

如果您想要一个端点,从数据库中删除所有不再物理存在于文件系统中的文件引用,代码应如下所示。

@app.route('/sync')
def sync():
    files = os.listdir(app.config['UPLOAD_FOLDER'])
    if File.query.filter(File.name.notin_(files)).delete():
        db.session.commit()
    return redirect(url_for('index'))

另一种选择是使用我不太熟悉的文件系统事件。下面是使用 watchdog.

的示例代码
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

# ...

class MyHandler(FileSystemEventHandler):
    def on_deleted(self, event):
        if not event.is_directory:
            target = event.src_path[len(app.config['UPLOAD_FOLDER'])+1:]
            if File.query.filter_by(name=target).delete():
                db.session.commit()

def run_watcher(path):
    fs_handler = MyHandler()
    observer = Observer()
    observer.schedule(fs_handler, path, recursive=False)
    observer.start()

run_watcher(app.config['UPLOAD_FOLDER'])

也可以有一个定期执行并删除所有无效条目的脚本。