【问题标题】:Django: How to use float precision instead of double precision in MySQLDjango:如何在 MySQL 中使用浮点精度而不是双精度
【发布时间】:2011-05-18 12:22:17
【问题描述】:

@987654321@ 在 MySQL 中创建一个 double。
是否可以以及如何创建浮点精度字段而不是双精度?

justification 类似于拥有 SmallIntegerField。

【问题讨论】:

  • 我不明白你为什么要这样做。给你买什么?磁盘空间很便宜。
  • @duffymo - 在我的情况下,我有数十个浮点列和数百万个条目,因此从双精度转换为浮点数可以显着缩小数据库大小并提高查询效率
  • 仍然微不足道。 “数十”个浮动列? “数百万”个条目?我怀疑它会产生你想象的效果。哪里有数据说是这样的?这是一个不值得付出代价的微优化。大型数据库的大小为 TB。除非你是这样,否则我会说你应该做一些更有成效的事情。

标签: mysql django orm


【解决方案1】:

嗯,还有比这更好的方法,而且更简单。当我在 django 中遇到以下 db_type() 方法时,我也想对我的数据库做同样的事情。

首先需要通过继承Field类在django中创建一个自定义Field

class customFloatField(models.Field): 
    def db_type(self,connection):
        return 'float'

然后您可以将其用作模型类中的任何其他模型字段

number = customFloatField(null=True,blank=True)

我试过了,这在 MySQL 中对我有用。要根据连接类型更改它,您必须检查 if 语句中的连接设置并进行相应更改。

https://docs.djangoproject.com/en/dev/howto/custom-model-fields/ 中提到了更多相关信息

【讨论】:

    【解决方案2】:

    有几个选项可以做到这一点,但我不明白你为什么要这样做。

    1. 在数据库中更改它,在重新创建表时不起作用,但 Django 不会进行手动转换,因此如果数据库发生更改,结果也会发生变化。
    2. 创建一个自定义字段类型(即继承FloatField并更改get_internal_type(),因此它返回类似SinglePrecisionFloatField的内容。之后您还需要创建自己的数据库后端并将自定义类型添加到creation.DatabaseCreation.data_types(来源:http://code.djangoproject.com/browser/django/trunk/django/db/backends/mysql/creation.py)
    3. 将每个FloatField 更改为单精度。与上面一样,您必须创建自己的数据库后端和/或更改当前数据库中的 FloatField 实现。

    【讨论】:

    • 在我的例子中,我有几十个浮点列和数百万个条目,所以从双精度到浮点数可以显着缩小数据库大小并提高查询效率
    • @Jonathan:它不会对性能产生太大影响(如果有的话)。就空间要求而言,假设您有 100 万个条目,那么它将为您节省大约 4 兆字节;)
    猜你喜欢
    • 2017-04-22
    • 2015-11-22
    • 2018-07-06
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多