Check to prohibit creating models with encrypted fields in non-encrypted databases crashes if the connection isn't initialized

XMLWordPrintableJSON

    • None
    • Python Drivers
    • Not Needed
    • None
    • None
    • None
    • None
    • None
    • None

      The check added in INTPYTHON-913 to prohibit creating models with encrypted fields in non-encrypted databases may fail if the database connection isn't initialized (e.g. the first query of a management command):

      Traceback (most recent call last):
        File "/Users/alex.clark/Developer/mongodb/django/.venv/bin/django-admin", line 10, in <module>
          sys.exit(execute_from_command_line())
                   ~~~~~~~~~~~~~~~~~~~~~~~~~^^
        File "/Users/alex.clark/Developer/mongodb/django/.venv/lib/python3.13/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
          utility.execute()
          ~~~~~~~~~~~~~~~^^
        File "/Users/alex.clark/Developer/mongodb/django/.venv/lib/python3.13/site-packages/django/core/management/__init__.py", line 437, in execute
          self.fetch_command(subcommand).run_from_argv(self.argv)
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^
        File "/Users/alex.clark/Developer/mongodb/django/.venv/lib/python3.13/site-packages/django/core/management/base.py", line 420, in run_from_argv
          self.execute(*args, **cmd_options)
          ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
        File "/Users/alex.clark/Developer/mongodb/django/.venv/lib/python3.13/site-packages/django/core/management/base.py", line 464, in execute
          output = self.handle(*args, **options)
        File "/Users/alex.clark/Developer/mongodb/django/medical-records/medical_records/management/commands/create_patient.py", line 63, in handle
          patient.save()
          ~~~~~~~~~~~~^^
        File "/Users/alex.clark/Developer/mongodb/django/.venv/lib/python3.13/site-packages/django/db/models/base.py", line 874, in save
          self.save_base(
          ~~~~~~~~~~~~~~^
              using=using,
              ^^^^^^^^^^^^
          ...<2 lines>...
              update_fields=update_fields,
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          )
          ^
        File "/Users/alex.clark/Developer/mongodb/django/.venv/lib/python3.13/site-packages/django/db/models/base.py", line 966, in save_base
          updated = self._save_table(
              raw,
          ...<4 lines>...
              update_fields,
          )
        File "/Users/alex.clark/Developer/mongodb/django/.venv/lib/python3.13/site-packages/django/db/models/base.py", line 1169, in _save_table
          results = self._do_insert(
              cls._base_manager, using, insert_fields, returning_fields, raw
          )
        File "/Users/alex.clark/Developer/mongodb/django/.venv/lib/python3.13/site-packages/django/db/models/base.py", line 1220, in _do_insert
          return manager._insert(
                 ~~~~~~~~~~~~~~~^
              [self],
              ^^^^^^^
          ...<3 lines>...
              raw=raw,
              ^^^^^^^^
          )
          ^
        File "/Users/alex.clark/Developer/mongodb/django/.venv/lib/python3.13/site-packages/django/db/models/manager.py", line 87, in manager_method
          return getattr(self.get_queryset(), name)(*args, **kwargs)
                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        File "/Users/alex.clark/Developer/mongodb/django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 1918, in _insert
          return query.get_compiler(using=using).execute_sql(returning_fields)
                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
        File "/Users/alex.clark/Developer/mongodb/django/django-mongodb-backend/django_mongodb_backend/compiler.py", line 908, in execute_sql
          value = field.get_db_prep_save(
              getattr(obj, field.attname)
          ...<2 lines>...
              connection=self.connection,
          )
        File "/Users/alex.clark/Developer/mongodb/django/django-mongodb-backend/django_mongodb_backend/fields/embedded_model.py", line 120, in get_db_prep_save
          value = field.get_db_prep_save(
              field.pre_save(embedded_instance, add), connection=connection
          )
        File "/Users/alex.clark/Developer/mongodb/django/django-mongodb-backend/django_mongodb_backend/fields/encryption.py", line 35, in get_db_prep_save
          if not connection.auto_encryption_opts:
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/Users/alex.clark/Developer/mongodb/django/.venv/lib/python3.13/site-packages/django/utils/functional.py", line 47, in __get__
          res = instance.__dict__[self.name] = self.func(instance)
                                               ~~~~~~~~~^^^^^^^^^^
        File "/Users/alex.clark/Developer/mongodb/django/django-mongodb-backend/django_mongodb_backend/base.py", line 389, in auto_encryption_opts
          return self.connection._options.auto_encryption_opts
                 ^^^^^^^^^^^^^^^^^^^^^^^^
      AttributeError: 'NoneType' object has no attribute '_options'

            Assignee:
            Tim Graham
            Reporter:
            Alex Clark
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: