【问题标题】:Custom sql in django migration doesn't workdjango迁移中的自定义sql不起作用
【发布时间】:2017-07-07 12:33:21
【问题描述】:

我正在尝试在我的迁移中运行自定义 SQL。看起来是这样的:

from django.db import migrations

class Migration(migrations.Migration):

    dependencies = [
    ]

    operations = [
        migrations.RunSQL(
            "SET timezone TO 'UTC'",
        ),
    ]

当我用

运行它时

./manage.py 迁移助手

我可以在日志中看到 SQL 命令已运行:

[17/Feb/2017 20:37:37] DEBUG [django.db.backends.schema:103] SET timezone TO 'UTC'; (params None)
[17/Feb/2017 20:37:37] DEBUG [django.db.backends:90] (0.000) SET timezone TO 'UTC';

但是当我去数据库中检查它时,它仍然说时区是本地时间:

gdp=# show timezone;
 TimeZone  
-----------
 localtime
(1 row)

如果我手动运行相同的命令,它可以正常工作:

gdp=# SET timezone TO 'UTC';
SET
gdp=# 
gdp=# show timezone;
 TimeZone 
----------
 UTC
(1 row)

Django 版本:1.10.5

PostgreSQL 版本:9.5.5

完整日志:

[17/Feb/2017 20:37:37] DEBUG [django.db.backends:90] (0.591) CREATE EXTENSION IF NOT EXISTS postgis; args=None
[17/Feb/2017 20:37:37] DEBUG [django.db.backends:90] (0.002) 
            SELECT c.relname, c.relkind
            FROM pg_catalog.pg_class c
            LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
            WHERE c.relkind IN ('r', 'v')
                AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
                AND pg_catalog.pg_table_is_visible(c.oid); args=None
[17/Feb/2017 20:37:37] DEBUG [django.db.backends.schema:103] CREATE TABLE "django_migrations" ("id" serial NOT NULL PRIMARY KEY, "app" varchar(255) NOT NULL, "name" varchar(255) NOT NULL, "applied" timestamp with time zone NOT NULL); (params None)
[17/Feb/2017 20:37:37] DEBUG [django.db.backends:90] (0.014) CREATE TABLE "django_migrations" ("id" serial NOT NULL PRIMARY KEY, "app" varchar(255) NOT NULL, "name" varchar(255) NOT NULL, "applied" timestamp with time zone NOT NULL); args=None
[17/Feb/2017 20:37:37] DEBUG [django.db.backends:90] (0.000) SELECT "django_migrations"."app", "django_migrations"."name" FROM "django_migrations"; args=()
[17/Feb/2017 20:37:37] DEBUG [django.db.backends:90] (0.001) 
            SELECT c.relname, c.relkind
            FROM pg_catalog.pg_class c
            LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
            WHERE c.relkind IN ('r', 'v')
                AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
                AND pg_catalog.pg_table_is_visible(c.oid); args=None
[17/Feb/2017 20:37:37] DEBUG [django.db.backends:90] (0.000) SELECT "django_migrations"."app", "django_migrations"."name" FROM "django_migrations"; args=()
[17/Feb/2017 20:37:37] DEBUG [django.db.backends.schema:103] SET timezone TO 'UTC'; (params None)
[17/Feb/2017 20:37:37] DEBUG [django.db.backends:90] (0.000) SET timezone TO 'UTC'; args=None
[17/Feb/2017 20:37:37] DEBUG [django.db.backends:90] (0.000) 
            SELECT c.relname, c.relkind
            FROM pg_catalog.pg_class c
            LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
            WHERE c.relkind IN ('r', 'v')
                AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
                AND pg_catalog.pg_table_is_visible(c.oid); args=None
[17/Feb/2017 20:37:37] DEBUG [django.db.backends:90] (0.000) INSERT INTO "django_migrations" ("app", "name", "applied") VALUES ('helper', '0001_initial', '2017-02-17T20:37:37.272476+00:00'::timestamptz) RETURNING "django_migrations"."id"; args=(u'helper', u'0001_initial', datetime.datetime(2017, 2, 17, 20, 37, 37, 272476, tzinfo=<UTC>))
[17/Feb/2017 20:37:37] DEBUG [django.db.backends:90] (0.001) 
            SELECT c.relname, c.relkind
            FROM pg_catalog.pg_class c
            LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
            WHERE c.relkind IN ('r', 'v')
                AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
                AND pg_catalog.pg_table_is_visible(c.oid); args=None
[17/Feb/2017 20:37:37] DEBUG [django.db.backends:90] (0.000) SELECT "django_migrations"."app", "django_migrations"."name" FROM "django_migrations"; args=()

编辑

我有这些设置:

USE_TZ = True 
TIME_ZONE = 'UTC' 

但是有了这个 Django 使用我的本地时区将日期时间保存到 Postgres,就像这样 '2016-09-12T08:06:45-04:00'。当我通过 Django 查询数据库时,它确实将其转换回 UTC,但我希望在 Postgres 中有“干净”的日期时间,类似于“2016-09-12T12:06:45+00”。

【问题讨论】:

    标签: django postgresql django-migrations


    【解决方案1】:

    当您使用 DateTimeField 时,Django 会设置自己的时区。在你的 settings.py 中,你应该找到这个设置:

    TIME_ZONE='UTC'
    

    您可以通过将其设置为 None 来禁用 djangos 时区使用。但是,我相信这会简单地将所有 DateTimeField 值转换为没有时区的值。 (没试过)

    我建议在任何情况下都使用 djangos TIME_ZONE 设置,因为它可以确保所有数据库的一致性。

    【讨论】:

    • 忘了提及这一点(将编辑我的帖子):我有这些设置:USE_TZ = True TIME_ZONE = 'UTC' 但有了这个 Django 将日期时间保存到 Postgres,就像这样 '2016-09-12T08:06:45-04: 00' 使用我的本地时区。当我通过 Django 查询数据库时,它确实将其转换回 UTC,但我想在 Postgres 中有“干净”的日期时间。
    【解决方案2】:

    我在 PostgreSQL 文档 8.5.3. Time Zones 中找到了我的问题的答案:

    SQL 命令 SET TIME ZONE 设置会话的时区。

    我可以通过在 postgresql.conf 中设置时区来解决这个问题(对我来说,它位于 /etc/postgresql/9.5/main)。

    【讨论】:

      猜你喜欢
      • 2013-07-05
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 2018-11-03
      • 2018-08-24
      相关资源
      最近更新 更多