断言错误:数据库连接未设置为 UTC

Nar*_*rma 58 django postgresql

我已经使用相同的设置多次完成服务器设置,但这次,我看到了错误消息。它甚至不允许迁移数据库。

System check identified no issues (0 silenced).
Exception in thread django-main-thread:
Traceback (most recent call last):
  File "/usr/lib/python3.9/threading.py", line 954, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.9/threading.py", line 892, in run
    self._target(*self._args, **self._kwargs)
  File "/home/datanal/datanal-samply/venv/lib/python3.9/site-packages/django/utils/autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "/home/datanal/datanal-samply/venv/lib/python3.9/site-packages/django/core/management/commands/runserver.py", line 120, in inner_run
    self.check_migrations()
  File "/home/datanal/datanal-samply/venv/lib/python3.9/site-packages/django/core/management/base.py", line 458, in check_migrations
    executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
  File "/home/datanal/datanal-samply/venv/lib/python3.9/site-packages/django/db/migrations/executor.py", line 18, in __init__
    self.loader = MigrationLoader(self.connection)
  File "/home/datanal/datanal-samply/venv/lib/python3.9/site-packages/django/db/migrations/loader.py", line 49, in __init__
    self.build_graph()
  File "/home/datanal/datanal-samply/venv/lib/python3.9/site-packages/django/db/migrations/loader.py", line 212, in build_graph
    self.applied_migrations = recorder.applied_migrations()
  File "/home/datanal/datanal-samply/venv/lib/python3.9/site-packages/django/db/migrations/recorder.py", line 77, in applied_migrations
    return {(migration.app, migration.name): migration for migration in self.migration_qs}
  File "/home/datanal/datanal-samply/venv/lib/python3.9/site-packages/django/db/models/query.py", line 276, in __iter__
    self._fetch_all()
  File "/home/datanal/datanal-samply/venv/lib/python3.9/site-packages/django/db/models/query.py", line 1261, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/home/datanal/datanal-samply/venv/lib/python3.9/site-packages/django/db/models/query.py", line 57, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
  File "/home/datanal/datanal-samply/venv/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 1170, in execute_sql
    return list(result)
  File "/home/datanal/datanal-samply/venv/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 1569, in cursor_iter
    for rows in iter((lambda: cursor.fetchmany(itersize)), sentinel):
  File "/home/datanal/datanal-samply/venv/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 1569, in <lambda>
    for rows in iter((lambda: cursor.fetchmany(itersize)), sentinel):
  File "/home/datanal/datanal-samply/venv/lib/python3.9/site-packages/django/db/utils.py", line 97, in inner
    return func(*args, **kwargs)
  File "/home/datanal/datanal-samply/venv/lib/python3.9/site-packages/django/db/backends/postgresql/utils.py", line 6, in utc_tzinfo_factory
    raise AssertionError("database connection isn't set to UTC")
AssertionError: database connection isn't set to UTC
Run Code Online (Sandbox Code Playgroud)

这是我的时区 settings.py。

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True
Run Code Online (Sandbox Code Playgroud)

操作系统:Ubuntu 21.04 Python 版本:3.9.5 Django 版本:3.0 PostgreSQL:13.3

我也经历了另一个问题,但没有找到任何解决方案。有没有人可以帮助我完成这项工作?我使用相同的代码设置了多个服务器,无需更改任何内容并且可以正常工作,但这次不是。

t-p*_*yne 101

最近对 psycopg2 2.9 版的更新导致了此问题,如此 GitHub 问题中所述:

https://github.com/psycopg/psycopg2/issues/1293#issuecomment-862835147

Psycopg 2.9 将传递给 tzinfo_factory 的值从 int 更改为 timedelta。Django 2.2(可能更新,但我在 2.2 上)检查了 offset == 0 并且因为 timedelta(0) != 0 它变得繁荣。

当前的解决方案是在您的需求文件中降级psycopg2(或者psycopg2-binary如果您使用的是独立包)低于 2.9(例如psycopg2>=2.8,<2.9)。

例如,您可以降级为2.8.6使用:

pip install psycopg2==2.8.6
Run Code Online (Sandbox Code Playgroud)

或者

pip install psycopg2-binary==2.8.6
Run Code Online (Sandbox Code Playgroud)

psycopg2发布历史

  • 可以确认这一点。将 `psycopg2-binary` 从 2.8.6 升级到 2.9 后出现问题。恢复即可解决 (8认同)
  • m1 mac 上没有使用 2.8.6 的选项..它不会编译:( (7认同)
  • 我可以确认上述降级到 pip install psycopg2-binary==2.8.6 的解决方案有效,我认为 psycopg2-binary-2.9.1 有需要修复的问题 (3认同)
  • 是的,我刚刚遇到了同样的问题,将 psycopg2 降级到 2.8.6 解决了它。 (2认同)

小智 23

我遇到了同样的问题,我通过简单地从我的 settings.py 文件中删除这一行来修复它

USE_TZ = True
Run Code Online (Sandbox Code Playgroud)

  • 通过快速测试,我可以确认 `USE_TZ = False` 确实修复了 psycopg2 (psycopg2==2.9.3) 连接问题。然而,这可能就是投反对票的原因,这样做可能会导致 Django 其他部分期望时区感知的各种其他问题,并会修改时间戳数据的性质(我希望它会,只是没有做任何进一步的事情)除了检查连接之外的测试还可以*读取*数据)。 (9认同)

Fed*_*o S 16

我通过升级 Django 而不是降级 psycopg 解决了这个问题。我不知道哪个版本完全解决了这个问题,但 3.2 肯定可以。

接受的答案现在已经过时,如果您可以选择升级 Django,您应该决定不降级。

  • 正如最近的许多评论所表明的那样,所接受的答案并没有过时。升级 Django 并不是一件简单的任务,应该仔细权衡 psycopg2 版本小幅降级的临时解决方法,该解决方法至今仍然可以正常工作(除非出于安全等其他原因升级 psycopg2 变得至关重要) 。 (6认同)

rad*_*tek 11

这就是我正在努力让这一切顺利进行的工作Django 2.2.x(与以下内容不兼容psycopg2>=2.9.0):

brew install libpq --build-from-source
brew install openssl
brew link openssl
export LDFLAGS="-L/opt/homebrew/opt/openssl@1.1/lib -L/opt/homebrew/opt/libpq/lib"
export CPPFLAGS="-I/opt/homebrew/opt/openssl@1.1/include -I/opt/homebrew/opt/libpq/include"
echo 'export PATH="/opt/homebrew/opt/openssl@3/bin:$PATH"' >> ~/.zshrc
brew install postgres
pip install psycopg2==2.8.6
Run Code Online (Sandbox Code Playgroud)

我在 M1 MacBook 上使用 BigSur。