跳转到主要内容

Django应用程序,用于重置存储Postgres扩展OID的django.contrib.postgres缓存

项目描述

django-postgres-hot-upgrade

Deployed to PyPI Deployed to PyPI Continuous Integration MIT License Contributor Covenant

让Django清除其PostgreSQL扩展OIDs缓存,以便在运行时更新PostgreSQL版本到新的大版本。

如何操作

$ pip install django-postgres-hot-upgrade
INSTALLED_APPS = [
    ...,
    # Warning: django_postgres_hot_upgrade requires to be placed before
    # django.contrib.postgres otherwise it will not work.
    'django_postgres_hot_upgrade',
    'django.contrib.postgres',
    ...,
]

为什么这样做

PostgreSQL为各种对象(包括加载的扩展)保留内部ID(OIDs)。为了与这些扩展交互,Django需要知道这些OIDs,因此它会加载它们,并在整个过程中将它们缓存在内存中,以避免不必要的请求

运行相同版本的PostgreSQL的多个服务器将具有一致的OIDs,但在升级时,OIDs可能会更改。如果您使用PostgreSQL负载均衡器,如pgbouncerpgpool,可能会想要在运行时迁移到新的主要PostgreSQL版本,以避免停机时间。实际上,对于足够新的PostgreSQL版本,这将是可行的,除了OID问题:如果OIDs更改,Django需要更新其缓存。

django_postgres_hot_upgrade在每次连接后记住服务器的PostgreSQL版本。当版本更新时,它会清除Django的内部OIDs缓存,强制Django获取新值。

其余部分

兼容性:请参阅tox.ini中测试的Python和Django版本。

许可证MIT

行为准则:本项目置于贡献者协议之下。请将任何滥用报告给joachim.jablon at people-doc.com

[维护者] 不太好看的部分

除了单元测试外,此包还有一个集成测试。为了测试此功能,我们需要在一个受控的CI环境中模拟由PG10到PG12的实时更新引起的OIDs更改。这是库中最脆弱的部分,也最有可能在未来中断。以下是需要了解的内容

  • docker-compose.yml定义了两个数据库postgres10postgres12,分别监听5432和5433。
  • tests/django_settings.py使用libpq环境变量定义了一个default数据库。请注意,在设置中,我们请求在正常数据库上而不是在专用的test_<foo>数据库上运行测试。
  • OIDs是在安装扩展时由Postgres创建的。这发生在tests/migrations/0001_initial.py中。《DJANGO_REVERSE_OPERATIONS》环境变量控制两个扩展创建的顺序。按照正常顺序运行PG10迁移,并按相反顺序运行PG12迁移,以确保OIDs将不同。
  • runtests脚本确保以决定顺序在两个数据库上运行迁移,然后启动测试。如果没有这样做,集成测试可能会失败,因为两个数据库中的OIDs将相同。
  • tox调用runtests
  • GitHub Actions调用tox

以下是在本地启动测试的工作方式

  • 在新鲜数据库上运行toxruntests
  • 如果您知道两个数据库上的OIDs已经正确设置,则运行pytests

项目详情


下载文件

下载适合您平台的应用程序。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

django-postgres-hot-upgrade-1.1.0.tar.gz (7.7 kB 查看哈希值)

上传时间:

构建分布

django_postgres_hot_upgrade-1.1.0-py3-none-any.whl (5.3 kB 查看哈希值)

上传于 Python 3

由以下支持