【问题标题】:django model use database server timedjango模型使用数据库服务器时间
【发布时间】:2023-03-24 02:28:01
【问题描述】:

我在不同的位置有 2 个独立的 django 服务器和一个 mysql 服务器

使用 django 模型,尝试创建/更新对象时(如下代码)。结果是具有相同 django 服务器本地时间值的 3 列。这样做时如何获取数据库服务器本地时间。

我的模特:

class Test(models.Model):
    id = models.AutoField(primary_key = True, null = False)
    create = models.DateTimeField(auto_now_add=True)
    update = models.DateTimeField(auto_now=True)
    test = models.DateTimeField(null=True)

我的代码:

y = Test()
y.test = datetime.now()
y.save()

结果

    id  create               update               test                  
------  -------------------  -------------------  ------------------- 
     6  2013-10-07 06:57:04  2013-10-07 06:57:04  2013-10-07 06:57:04  

【问题讨论】:

  • 您想这样做的原因是什么?通常最好以 UTC 格式存储时间,然后在演示期间转换为适当的时区。
  • 原因是我有一个数据库服务器用于少数 Web 服务器。为了一致,所有数据都应该使用数据库服务器时间
  • @Hardy 你试过 django 数据库函数的 Now() docs.djangoproject.com/en/1.10/ref/models/database-functions/… 你解决了吗?如果是的话,你是怎么做到的?

标签: python mysql django django-models


【解决方案1】:

如果您在 Django 中处理此问题,django 将在将数据保存到数据库之前设置这些字段。在这种情况下,Django 会根据你的应用服务器(django 运行的服务器)设置时间。

您必须对 MySql 安装进行一些设置(如果您尚未设置它们)。然后你必须重新创建你的表或在你的数据库中改变它们(我猜 Django 模型定义不能处理这个)。这是how-to doc explaning these settings

一个示例 sql CREATE TABLE 语句如下所示

CREATE TABLE test_test (
    create DATETIME DEFAULT CURRENT_TIMESTAMP,
    update DATETIME DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
)

如果您已经在 yotr 表中有数据,那么您可以执行 ALTERs' 而不是重新创建表。

然后你必须编辑你的模型并将相关的日期时间字段设置为null,以便MySql可以设置它们。

class Test(models.Model):
    id = models.AutoField(primary_key = True, null = False)
    create = models.DateTimeField(null=True)
    update = models.DateTimeField(null=True)
    test = models.DateTimeField(null=True)

【讨论】:

    【解决方案2】:

    我认为如果不设置数据库时区,您将无法做您想做的事。让我们看看每个日期的含义:

    create = models.DateTimeField(auto_now_add=True)
    

    它会自动将日期设置为您添加它的时间。

    update = models.DateTimeField(auto_now=True)
    

    它会自动将日期设置为您启动进程(Web 进程或命令)的时间。

    test = models.DateTimeField(null=True)
    ...
    y.test = datetime.now()
    

    它将日期设置为进程的时间(Django 进程运行的地方)。

    要获取数据库时间,您可以将数据库的时区存储在设置中,并在必要时使用它。您不能为此使用任何自动生成的字段。

    另一种解决方案可能是在数据库中手动(通过原始查询)获取本地时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-15
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      相关资源
      最近更新 更多