如何在Django中的每一天在数据库中创建新表

MK8*_*K87 2 sql django django-models mariadb python-3.x

我有一个理解问题,因为我正在考虑如何在Django或数据库中管理我的数据.

这是一张每天约2000行和8列的表格.我想将过去10年的所有日常数据存储到数据库中,并每天添加新数据.为每天创建数据库表是个好主意.在Django中,为每个模型创建了一个表,但是发明者并不打算在Django中创建5000个模型.

这是我使用原始SQL创建表的唯一方法吗?或者有没有我在文档中没有发现的方法?

lod*_*odb 5

老实说,每天一张表并不是 Django 的最佳方式,因为它会使整个框架更难使用:

  • 你需要每天创建一个新模型
  • 你需要每天进行迁移
  • 或者你会完全跳过使用 ORM

如果速度是您每天保留一张表的原因,我只会使用一张表,并在日期字段上使用数据库索引。它可能会慢一点,但它会让你的生活变得更轻松。

您需要将其添加到您的模型定义中:

class Meta:
    indexes = [
        models.Index(fields=['day',]),
    ]
Run Code Online (Sandbox Code Playgroud)

该手册更详细地解释了它:https ://docs.djangoproject.com/en/1.11/ref/models/indexes/


hun*_*eke 5

对您提出的问题的简短回答是"是的,最快的方法是使用原始SQL",或者是动态创建新模型并运行makemigrations的变体.

也就是说,在没有关于您的问题或任务的更多细节的情况下,我必须立即质疑为什么要动态创建表.对于初学者来说,这将失去Django提供的与架构的良好ORM连接,而无需更多技巧(自动生成的模型,每日makemigrations,迁移期间可能存在错位的数据,您需要专门的代码等).一些想法:

  1. 对于几乎任何基于Web的项目,即使容量最小,2000行也几乎没有.甚至每天.经过一整年,那只有730k行.假设您的访问模式具有正确的模式索引和规范化,那对于RDBMS来说仍然可以忽略不计.
  2. 如果你真的需要计划拆分,考虑也许这样做在年度或十年级.730K*10年只有 7.3米的行,一般还是可以忽略不计(给予适当的标准化和索引)的境界考虑.

如果这个问题的前提是您遇到了速度问题,那么我建议您需要仔细考虑数据模型的规范化,并考虑需要添加索引的位置.例如,如果您的默认数据模型不能提供正确的索引,那么使用@ lodb(快速手指!)建议并手动告诉Django的ORM创建索引:

class Meta:
    indexes = [
        models.Index(fields=['day',]),
    ]
Run Code Online (Sandbox Code Playgroud)