【问题标题】:Storing file content in DB将文件内容存储在数据库中
【发布时间】:2010-11-07 21:53:03
【问题描述】:

我正在制作一个模型,其中有一个FileField。我想将文件内容存储在数据库列中,而不是文件路径中。有什么建议吗?

【问题讨论】:

  • 你为什么要这样做?文件属于文件系统。
  • 您希望在数据库中存储多少二进制数据?与存储数千个大型二进制文件相比,在数据库中存储几个二进制对象有很大的不同。
  • 是的。该决定的理由是什么?为什么不将它们存储在 FS 上?

标签: django django-admin django-forms


【解决方案1】:

无视反对者。如果您想完全控制您的内容,请将文件放在数据库中的 blob 字段中。我通常还将文件名保存在一个单独的字段中,以便我可以根据需要重新构建文件(这样可以保留扩展名,在大多数操作系统中它与文件类型相关联)。

确保将实际的 blob 数据存储在单独的表中,仅通过 id 连接到您的文件名/额外信息表...这样在处理与其他文件相关的任何信息时,您不会牺牲任何性能比内容本身。

反对者没有意识到,数据库只是一种极其优化的文件系统形式。字节是字节,磁盘扇区是磁盘扇区。数据库在组织和搜索这些字节方面比文件系统要好得多。更不用说,数据库实现了比大多数文件系统更严格的安全性,并且维护得更好(通过备份、支持人员等)。

【讨论】:

  • 我只想将文件内容存储在表的 db 列中,不想为此浪费表。我可以以相同的模式再次恢复文件内容。
  • 感谢您对现实情况的一点了解。我一直觉得 Django 对在数据库中存储文件的默认厌恶过于简单化。即使您想从数据库中为它们提供服务,您也可以始终使用缓存层包装您的模型,以实现两全其美。
【解决方案2】:

我知道这是一个老问题,但是从那时起已经编写了一些很好的代码来允许这个选项。具体看django-database-files,它将使用Django的存储API,让所有的FileFields和ImageFields都将其内容存储在数据库中。还有一个fork 将文件本地缓存在文件系统上,以克服使用数据库的最大警告,即延迟。

【讨论】:

    【解决方案3】:

    那么,将它简单地存储在二进制列中怎么样?然后,您可以存储字节集合。如果文件名对您也很重要,您可以将其存储在额外的名称列中。

    【讨论】:

      【解决方案4】:

      很简单

      只需在管理员中覆盖保存方法

      filecontent=form.cleaned_data.get('upload_file')  
      data =filecontent.read()
      from django.db import connection
      cursor = connection.cursor()
      cursor.execute("update filecontent set filecontent=(%s) where id=(%s)",[data,obj.id])
      connection.connection.commit()
      cursor.close()
      connection.close()
      

      这会将文件内容存储在表文件内容的 db 列文件内容中

      【讨论】:

      • 这行不通。您尝试使用非 ASCII 字符保存的第一个二进制文件会炸毁它。你需要先用base64编码,然后在从数据库中读取出来的时候再解码。
      猜你喜欢
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      相关资源
      最近更新 更多