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

时间:2017-10-30 15:08:45

标签: sql django python-3.x django-models mariadb

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

  1. 对于几乎所有基于Web的项目,即使容量最小,2000行也几乎没有。甚至每天。经过一整年,这只有730k行。假设您的访问模式具有适当的模式索引和normalization,那对于RDBMS来说仍然可以忽略不计。
  2. 如果您确实需要计划分片,请考虑或许在年度或年代级别进行分组。 730K * 10年 7.3M行,通常仍然在可忽略不计的范围内考虑(给定适当的规范化和索引)。
  3. 如果此问题的前提是您遇到速度问题,那么我建议您需要仔细考虑您的数据模型normalization,并考虑您需要添加索引的位置。例如,如果您的默认数据模型不能提供正确的索引,那么使用@ lodb' s(快速手指!)建议并手动告诉Django的ORM创建索引:

    class Meta:
        indexes = [
            models.Index(fields=['day',]),
        ]
    

答案 1 :(得分:4)

老实说,每天一张桌子不是Django的最佳选择,因为它会使整个框架更难用:

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

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

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

class Meta:
    indexes = [
        models.Index(fields=['day',]),
    ]

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