Skip to content

Setting up pytest-postgresql with pytest-django leads to unreset sequence number #1199

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
RemiDesgrange opened this issue May 16, 2025 · 0 comments
Assignees

Comments

@RemiDesgrange
Copy link

I have setup pytest-postgresql with pytest django but sequence (or identity)

ex:

def test1(db):
    m = MyModel.objects.create()
    assert m.id == 1 # => true

def test2(db):
    m = MyModel.objects.create()
    assert m.id == 1 # true ONLY if I run the test alone.

I have set up the db in my conftest.py like this:

import psycopg2
import pytest
from django.db import connections
from pytest_postgresql import factories


def create_postgis_ext(host, port, user, dbname, password):
    with (
        psycopg2.connect(
            dbname=dbname,
            user=user,
            password=password,
            host=host,
            port=port,
        ) as con,
        con.cursor() as con,
    ):
        con.execute("CREATE EXTENSION postgis;")



  postgres_options = (
      "-c wal_level=minimal "
      "-c max_wal_senders=0 "
      "-c fsync=off "
      "-c synchronous_commit=off "
      "-c full_page_writes=off "
      "-c checkpoint_timeout=1d "  # Long timeout to avoid checkpoints
      "-c max_wal_size=10GB "  # Large max WAL size to avoid forced checkpoints
      "-c shared_buffers=256MB "  # Increased shared buffers for better caching
      "-c work_mem=64MB"  # Larger work memory for faster operations
  )
  postgresql_proc_general = factories.postgresql_proc(postgres_options=postgres_options, dbname="general")
  postgresql_proc_gis = factories.postgresql_proc(
      postgres_options=postgres_options, load=[create_postgis_ext], dbname="gis"
  )
  postgresql_proc_othergis = factories.postgresql_proc(
      postgres_options=postgres_options, load=[create_postgis_ext], dbname="othergis"
  )

  @pytest.fixture(scope="session")
  def django_db_setup(request, postgresql_proc_general, postgresql_proc_gis, postgresql_proc_othergis):
      from django.conf import settings

      # remove cached_property of connections.settings from the cache
      del connections.__dict__["settings"]
      db_fixture_mapping = {
          "default": postgresql_proc_general,
          "gis": postgresql_proc_gis,
          "othergis": postgresql_proc_othergis,
      }
      for db, fixture in db_fixture_mapping.items():
          settings.DATABASES[db]["ENGINE"] = "django.contrib.gis.db.backends.postgis"
          settings.DATABASES[db]["NAME"] = fixture.dbname
          settings.DATABASES[db]["USER"] = fixture.user
          settings.DATABASES[db]["PASSWORD"] = fixture.password
          settings.DATABASES[db]["HOST"] = fixture.host
          settings.DATABASES[db]["PORT"] = fixture.port
          settings.DATABASES[db]["OPTIONS"] = {"connect_timeout": 10}
          settings.DATABASES[db]["TEST"]["NAME"] = fixture.dbname

      # re-configure the settings given the changed database config
      connections.settings = connections.configure_settings(settings.DATABASES)
      # open a connection to the database with the new database config
      connections["default"] = connections.create_connection("default")
      yield request.getfixturevalue("django_db_setup")

For this setup, I have read existing issues about setting up custom db (like #1183), as well as a pending PR #1190). I may be missing something. Note that removing the del connections.__dict__["settings"] and connections["default"] = connections.create_connection("default") would break my setup (but I was unable to understand why)

@kingbuzzman kingbuzzman self-assigned this May 19, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants