Explorar o código

Fixes #19440: Ensure data migrations use the correct database connection

Jeremy Stretch hai 9 meses
pai
achega
76aa255f07
Modificáronse 32 ficheiros con 196 adicións e 130 borrados
  1. 4 3
      netbox/circuits/migrations/0046_charfield_null_choices.py
  2. 4 3
      netbox/circuits/migrations/0047_circuittermination__termination.py
  3. 7 2
      netbox/circuits/migrations/0048_circuitterminations_cached_relations.py
  4. 2 1
      netbox/circuits/migrations/0051_virtualcircuit_group_assignment.py
  5. 43 42
      netbox/dcim/migrations/0194_charfield_null_choices.py
  6. 10 3
      netbox/dcim/migrations/0200_populate_mac_addresses.py
  7. 3 1
      netbox/dcim/migrations/0206_load_module_type_profiles.py
  8. 4 3
      netbox/extras/migrations/0108_convert_reports_to_scripts.py
  9. 23 8
      netbox/extras/migrations/0109_script_model.py
  10. 2 3
      netbox/extras/migrations/0115_convert_dashboard_widgets.py
  11. 3 1
      netbox/extras/migrations/0116_custom_link_button_color.py
  12. 5 3
      netbox/extras/migrations/0117_move_objectchange.py
  13. 2 1
      netbox/extras/migrations/0120_eventrule_event_types.py
  14. 2 1
      netbox/extras/migrations/0122_charfield_null_choices.py
  15. 3 1
      netbox/extras/migrations/0123_journalentry_kind_default.py
  16. 3 1
      netbox/ipam/migrations/0070_vlangroup_vlan_id_ranges.py
  17. 4 2
      netbox/ipam/migrations/0071_prefix_scope.py
  18. 3 2
      netbox/ipam/migrations/0072_prefix_cached_relations.py
  19. 3 2
      netbox/ipam/migrations/0073_charfield_null_choices.py
  20. 8 6
      netbox/ipam/migrations/0080_populate_service_parent.py
  21. 2 1
      netbox/tenancy/migrations/0016_charfield_null_choices.py
  22. 3 3
      netbox/tenancy/migrations/0018_contact_groups.py
  23. 10 6
      netbox/users/migrations/0005_alter_user_table.py
  24. 3 2
      netbox/users/migrations/0006_custom_group_model.py
  25. 4 5
      netbox/users/migrations/0009_update_group_perms.py
  26. 7 6
      netbox/virtualization/migrations/0040_convert_disk_size.py
  27. 2 1
      netbox/virtualization/migrations/0041_charfield_null_choices.py
  28. 4 2
      netbox/virtualization/migrations/0044_cluster_scope.py
  29. 3 2
      netbox/virtualization/migrations/0045_clusters_cached_relations.py
  30. 9 4
      netbox/virtualization/migrations/0048_populate_mac_addresses.py
  31. 5 4
      netbox/vpn/migrations/0006_charfield_null_choices.py
  32. 6 5
      netbox/wireless/migrations/0010_charfield_null_choices.py

+ 4 - 3
netbox/circuits/migrations/0046_charfield_null_choices.py

@@ -8,10 +8,11 @@ def set_null_values(apps, schema_editor):
     Circuit = apps.get_model('circuits', 'Circuit')
     CircuitGroupAssignment = apps.get_model('circuits', 'CircuitGroupAssignment')
     CircuitTermination = apps.get_model('circuits', 'CircuitTermination')
+    db_alias = schema_editor.connection.alias
 
-    Circuit.objects.filter(distance_unit='').update(distance_unit=None)
-    CircuitGroupAssignment.objects.filter(priority='').update(priority=None)
-    CircuitTermination.objects.filter(cable_end='').update(cable_end=None)
+    Circuit.objects.using(db_alias).filter(distance_unit='').update(distance_unit=None)
+    CircuitGroupAssignment.objects.using(db_alias).filter(priority='').update(priority=None)
+    CircuitTermination.objects.using(db_alias).filter(cable_end='').update(cable_end=None)
 
 
 class Migration(migrations.Migration):

+ 4 - 3
netbox/circuits/migrations/0047_circuittermination__termination.py

@@ -8,14 +8,15 @@ def copy_site_assignments(apps, schema_editor):
     """
     ContentType = apps.get_model('contenttypes', 'ContentType')
     CircuitTermination = apps.get_model('circuits', 'CircuitTermination')
+    ProviderNetwork = apps.get_model('circuits', 'ProviderNetwork')
     Site = apps.get_model('dcim', 'Site')
+    db_alias = schema_editor.connection.alias
 
-    CircuitTermination.objects.filter(site__isnull=False).update(
+    CircuitTermination.objects.using(db_alias).filter(site__isnull=False).update(
         termination_type=ContentType.objects.get_for_model(Site), termination_id=models.F('site_id')
     )
 
-    ProviderNetwork = apps.get_model('circuits', 'ProviderNetwork')
-    CircuitTermination.objects.filter(provider_network__isnull=False).update(
+    CircuitTermination.objects.using(db_alias).filter(provider_network__isnull=False).update(
         termination_type=ContentType.objects.get_for_model(ProviderNetwork),
         termination_id=models.F('provider_network_id'),
     )

+ 7 - 2
netbox/circuits/migrations/0048_circuitterminations_cached_relations.py

@@ -7,15 +7,20 @@ def populate_denormalized_fields(apps, schema_editor):
     Copy site ForeignKey values to the Termination GFK.
     """
     CircuitTermination = apps.get_model('circuits', 'CircuitTermination')
+    db_alias = schema_editor.connection.alias
 
-    terminations = CircuitTermination.objects.filter(site__isnull=False).prefetch_related('site')
+    terminations = CircuitTermination.objects.using(db_alias).filter(site__isnull=False).prefetch_related('site')
     for termination in terminations:
         termination._region_id = termination.site.region_id
         termination._site_group_id = termination.site.group_id
         termination._site_id = termination.site_id
         # Note: Location cannot be set prior to migration
 
-    CircuitTermination.objects.bulk_update(terminations, ['_region', '_site_group', '_site'], batch_size=100)
+    CircuitTermination.objects.using(db_alias).bulk_update(
+        terminations,
+        ['_region', '_site_group', '_site'],
+        batch_size=100
+    )
 
 
 class Migration(migrations.Migration):

+ 2 - 1
netbox/circuits/migrations/0051_virtualcircuit_group_assignment.py

@@ -9,8 +9,9 @@ def set_member_type(apps, schema_editor):
     ContentType = apps.get_model('contenttypes', 'ContentType')
     Circuit = apps.get_model('circuits', 'Circuit')
     CircuitGroupAssignment = apps.get_model('circuits', 'CircuitGroupAssignment')
+    db_alias = schema_editor.connection.alias
 
-    CircuitGroupAssignment.objects.update(
+    CircuitGroupAssignment.objects.using(db_alias).update(
         member_type=ContentType.objects.get_for_model(Circuit)
     )
 

+ 43 - 42
netbox/dcim/migrations/0194_charfield_null_choices.py

@@ -26,49 +26,50 @@ def set_null_values(apps, schema_editor):
     RackType = apps.get_model('dcim', 'RackType')
     RearPort = apps.get_model('dcim', 'RearPort')
     Site = apps.get_model('dcim', 'Site')
+    db_alias = schema_editor.connection.alias
 
-    Cable.objects.filter(length_unit='').update(length_unit=None)
-    Cable.objects.filter(type='').update(type=None)
-    ConsolePort.objects.filter(cable_end='').update(cable_end=None)
-    ConsolePort.objects.filter(type='').update(type=None)
-    ConsolePortTemplate.objects.filter(type='').update(type=None)
-    ConsoleServerPort.objects.filter(cable_end='').update(cable_end=None)
-    ConsoleServerPort.objects.filter(type='').update(type=None)
-    ConsoleServerPortTemplate.objects.filter(type='').update(type=None)
-    Device.objects.filter(airflow='').update(airflow=None)
-    Device.objects.filter(face='').update(face=None)
-    DeviceType.objects.filter(airflow='').update(airflow=None)
-    DeviceType.objects.filter(subdevice_role='').update(subdevice_role=None)
-    DeviceType.objects.filter(weight_unit='').update(weight_unit=None)
-    FrontPort.objects.filter(cable_end='').update(cable_end=None)
-    Interface.objects.filter(cable_end='').update(cable_end=None)
-    Interface.objects.filter(mode='').update(mode=None)
-    Interface.objects.filter(poe_mode='').update(poe_mode=None)
-    Interface.objects.filter(poe_type='').update(poe_type=None)
-    Interface.objects.filter(rf_channel='').update(rf_channel=None)
-    Interface.objects.filter(rf_role='').update(rf_role=None)
-    InterfaceTemplate.objects.filter(poe_mode='').update(poe_mode=None)
-    InterfaceTemplate.objects.filter(poe_type='').update(poe_type=None)
-    InterfaceTemplate.objects.filter(rf_role='').update(rf_role=None)
-    ModuleType.objects.filter(airflow='').update(airflow=None)
-    ModuleType.objects.filter(weight_unit='').update(weight_unit=None)
-    PowerFeed.objects.filter(cable_end='').update(cable_end=None)
-    PowerOutlet.objects.filter(cable_end='').update(cable_end=None)
-    PowerOutlet.objects.filter(feed_leg='').update(feed_leg=None)
-    PowerOutlet.objects.filter(type='').update(type=None)
-    PowerOutletTemplate.objects.filter(feed_leg='').update(feed_leg=None)
-    PowerOutletTemplate.objects.filter(type='').update(type=None)
-    PowerPort.objects.filter(cable_end='').update(cable_end=None)
-    PowerPort.objects.filter(type='').update(type=None)
-    PowerPortTemplate.objects.filter(type='').update(type=None)
-    Rack.objects.filter(airflow='').update(airflow=None)
-    Rack.objects.filter(form_factor='').update(form_factor=None)
-    Rack.objects.filter(outer_unit='').update(outer_unit=None)
-    Rack.objects.filter(weight_unit='').update(weight_unit=None)
-    RackType.objects.filter(outer_unit='').update(outer_unit=None)
-    RackType.objects.filter(weight_unit='').update(weight_unit=None)
-    RearPort.objects.filter(cable_end='').update(cable_end=None)
-    Site.objects.filter(time_zone='').update(time_zone=None)
+    Cable.objects.using(db_alias).filter(length_unit='').update(length_unit=None)
+    Cable.objects.using(db_alias).filter(type='').update(type=None)
+    ConsolePort.objects.using(db_alias).filter(cable_end='').update(cable_end=None)
+    ConsolePort.objects.using(db_alias).filter(type='').update(type=None)
+    ConsolePortTemplate.objects.using(db_alias).filter(type='').update(type=None)
+    ConsoleServerPort.objects.using(db_alias).filter(cable_end='').update(cable_end=None)
+    ConsoleServerPort.objects.using(db_alias).filter(type='').update(type=None)
+    ConsoleServerPortTemplate.objects.using(db_alias).filter(type='').update(type=None)
+    Device.objects.using(db_alias).filter(airflow='').update(airflow=None)
+    Device.objects.using(db_alias).filter(face='').update(face=None)
+    DeviceType.objects.using(db_alias).filter(airflow='').update(airflow=None)
+    DeviceType.objects.using(db_alias).filter(subdevice_role='').update(subdevice_role=None)
+    DeviceType.objects.using(db_alias).filter(weight_unit='').update(weight_unit=None)
+    FrontPort.objects.using(db_alias).filter(cable_end='').update(cable_end=None)
+    Interface.objects.using(db_alias).filter(cable_end='').update(cable_end=None)
+    Interface.objects.using(db_alias).filter(mode='').update(mode=None)
+    Interface.objects.using(db_alias).filter(poe_mode='').update(poe_mode=None)
+    Interface.objects.using(db_alias).filter(poe_type='').update(poe_type=None)
+    Interface.objects.using(db_alias).filter(rf_channel='').update(rf_channel=None)
+    Interface.objects.using(db_alias).filter(rf_role='').update(rf_role=None)
+    InterfaceTemplate.objects.using(db_alias).filter(poe_mode='').update(poe_mode=None)
+    InterfaceTemplate.objects.using(db_alias).filter(poe_type='').update(poe_type=None)
+    InterfaceTemplate.objects.using(db_alias).filter(rf_role='').update(rf_role=None)
+    ModuleType.objects.using(db_alias).filter(airflow='').update(airflow=None)
+    ModuleType.objects.using(db_alias).filter(weight_unit='').update(weight_unit=None)
+    PowerFeed.objects.using(db_alias).filter(cable_end='').update(cable_end=None)
+    PowerOutlet.objects.using(db_alias).filter(cable_end='').update(cable_end=None)
+    PowerOutlet.objects.using(db_alias).filter(feed_leg='').update(feed_leg=None)
+    PowerOutlet.objects.using(db_alias).filter(type='').update(type=None)
+    PowerOutletTemplate.objects.using(db_alias).filter(feed_leg='').update(feed_leg=None)
+    PowerOutletTemplate.objects.using(db_alias).filter(type='').update(type=None)
+    PowerPort.objects.using(db_alias).filter(cable_end='').update(cable_end=None)
+    PowerPort.objects.using(db_alias).filter(type='').update(type=None)
+    PowerPortTemplate.objects.using(db_alias).filter(type='').update(type=None)
+    Rack.objects.using(db_alias).filter(airflow='').update(airflow=None)
+    Rack.objects.using(db_alias).filter(form_factor='').update(form_factor=None)
+    Rack.objects.using(db_alias).filter(outer_unit='').update(outer_unit=None)
+    Rack.objects.using(db_alias).filter(weight_unit='').update(weight_unit=None)
+    RackType.objects.using(db_alias).filter(outer_unit='').update(outer_unit=None)
+    RackType.objects.using(db_alias).filter(weight_unit='').update(weight_unit=None)
+    RearPort.objects.using(db_alias).filter(cable_end='').update(cable_end=None)
+    Site.objects.using(db_alias).filter(time_zone='').update(time_zone=None)
 
 
 class Migration(migrations.Migration):

+ 10 - 3
netbox/dcim/migrations/0200_populate_mac_addresses.py

@@ -6,19 +6,26 @@ def populate_mac_addresses(apps, schema_editor):
     ContentType = apps.get_model('contenttypes', 'ContentType')
     Interface = apps.get_model('dcim', 'Interface')
     MACAddress = apps.get_model('dcim', 'MACAddress')
+    db_alias = schema_editor.connection.alias
     interface_ct = ContentType.objects.get_for_model(Interface)
 
     mac_addresses = [
         MACAddress(
-            mac_address=interface.mac_address, assigned_object_type=interface_ct, assigned_object_id=interface.pk
+            mac_address=interface.mac_address,
+            assigned_object_type=interface_ct,
+            assigned_object_id=interface.pk
         )
         for interface in Interface.objects.filter(mac_address__isnull=False)
     ]
-    MACAddress.objects.bulk_create(mac_addresses, batch_size=100)
+    MACAddress.objects.using(db_alias).bulk_create(mac_addresses, batch_size=100)
 
     # TODO: Optimize interface updates
     for mac_address in mac_addresses:
-        Interface.objects.filter(pk=mac_address.assigned_object_id).update(primary_mac_address=mac_address)
+        Interface.objects.using(db_alias).filter(
+            pk=mac_address.assigned_object_id
+        ).update(
+            primary_mac_address=mac_address
+        )
 
 
 class Migration(migrations.Migration):

+ 3 - 1
netbox/dcim/migrations/0206_load_module_type_profiles.py

@@ -11,6 +11,8 @@ def load_initial_data(apps, schema_editor):
     Load initial ModuleTypeProfile objects from file.
     """
     ModuleTypeProfile = apps.get_model('dcim', 'ModuleTypeProfile')
+    db_alias = schema_editor.connection.alias
+
     initial_profiles = (
         'cpu',
         'fan',
@@ -25,7 +27,7 @@ def load_initial_data(apps, schema_editor):
         with file_path.open('r') as f:
             data = json.load(f)
             try:
-                ModuleTypeProfile.objects.create(**data)
+                ModuleTypeProfile.objects.using(db_alias).create(**data)
             except Exception as e:
                 print(f"Error loading data from {file_path}")
                 raise e

+ 4 - 3
netbox/extras/migrations/0108_convert_reports_to_scripts.py

@@ -4,11 +4,12 @@ from django.db import migrations
 def convert_reportmodule_jobs(apps, schema_editor):
     ContentType = apps.get_model('contenttypes', 'ContentType')
     Job = apps.get_model('core', 'Job')
+    db_alias = schema_editor.connection.alias
 
     # Convert all ReportModule jobs to ScriptModule jobs
-    if reportmodule_ct := ContentType.objects.filter(app_label='extras', model='reportmodule').first():
-        scriptmodule_ct = ContentType.objects.get(app_label='extras', model='scriptmodule')
-        Job.objects.filter(object_type_id=reportmodule_ct.id).update(object_type_id=scriptmodule_ct.id)
+    if reportmodule_ct := ContentType.objects.using(db_alias).filter(app_label='extras', model='reportmodule').first():
+        scriptmodule_ct = ContentType.objects.using(db_alias).get(app_label='extras', model='scriptmodule')
+        Job.objects.using(db_alias).filter(object_type_id=reportmodule_ct.id).update(object_type_id=scriptmodule_ct.id)
 
 
 class Migration(migrations.Migration):

+ 23 - 8
netbox/extras/migrations/0109_script_model.py

@@ -88,24 +88,33 @@ def update_scripts(apps, schema_editor):
     ScriptModule = apps.get_model('extras', 'ScriptModule')
     ReportModule = apps.get_model('extras', 'ReportModule')
     Job = apps.get_model('core', 'Job')
+    db_alias = schema_editor.connection.alias
 
     script_ct = ContentType.objects.get_for_model(Script, for_concrete_model=False)
     scriptmodule_ct = ContentType.objects.get_for_model(ScriptModule, for_concrete_model=False)
     reportmodule_ct = ContentType.objects.get_for_model(ReportModule, for_concrete_model=False)
 
-    for module in ScriptModule.objects.all():
+    for module in ScriptModule.objects.using(db_alias).all():
         for script_name in get_module_scripts(module):
-            script = Script.objects.create(
+            script = Script.objects.using(db_alias).create(
                 name=script_name,
                 module=module,
             )
 
             # Update all Jobs associated with this ScriptModule & script name to point to the new Script object
-            Job.objects.filter(object_type_id=scriptmodule_ct.id, object_id=module.pk, name=script_name).update(
+            Job.objects.using(db_alias).filter(
+                object_type_id=scriptmodule_ct.id,
+                object_id=module.pk,
+                name=script_name
+            ).update(
                 object_type_id=script_ct.id, object_id=script.pk
             )
             # Update all Jobs associated with this ScriptModule & script name to point to the new Script object
-            Job.objects.filter(object_type_id=reportmodule_ct.id, object_id=module.pk, name=script_name).update(
+            Job.objects.using(db_alias).filter(
+                object_type_id=reportmodule_ct.id,
+                object_id=module.pk,
+                name=script_name
+            ).update(
                 object_type_id=script_ct.id, object_id=script.pk
             )
 
@@ -119,16 +128,22 @@ def update_event_rules(apps, schema_editor):
     Script = apps.get_model('extras', 'Script')
     ScriptModule = apps.get_model('extras', 'ScriptModule')
     EventRule = apps.get_model('extras', 'EventRule')
+    db_alias = schema_editor.connection.alias
 
     script_ct = ContentType.objects.get_for_model(Script)
     scriptmodule_ct = ContentType.objects.get_for_model(ScriptModule)
 
-    for eventrule in EventRule.objects.filter(action_object_type=scriptmodule_ct):
+    for eventrule in EventRule.objects.using(db_alias).filter(action_object_type=scriptmodule_ct):
         name = eventrule.action_parameters.get('script_name')
-        obj, __ = Script.objects.get_or_create(
-            module_id=eventrule.action_object_id, name=name, defaults={'is_executable': False}
+        obj, __ = Script.objects.using(db_alias).get_or_create(
+            module_id=eventrule.action_object_id,
+            name=name,
+            defaults={'is_executable': False}
+        )
+        EventRule.objects.using(db_alias).filter(pk=eventrule.pk).update(
+            action_object_type=script_ct,
+            action_object_id=obj.id
         )
-        EventRule.objects.filter(pk=eventrule.pk).update(action_object_type=script_ct, action_object_id=obj.id)
 
 
 class Migration(migrations.Migration):

+ 2 - 3
netbox/extras/migrations/0115_convert_dashboard_widgets.py

@@ -1,12 +1,11 @@
-# Generated by Django 5.0.4 on 2024-04-24 20:09
-
 from django.db import migrations
 
 
 def update_dashboard_widgets(apps, schema_editor):
     Dashboard = apps.get_model('extras', 'Dashboard')
+    db_alias = schema_editor.connection.alias
 
-    for dashboard in Dashboard.objects.all():
+    for dashboard in Dashboard.objects.using(db_alias).all():
         for key, widget in dashboard.config.items():
             if models := widget['config'].get('models'):
                 models = list(map(lambda x: x.replace('users.netboxgroup', 'users.group'), models))

+ 3 - 1
netbox/extras/migrations/0116_custom_link_button_color.py

@@ -3,7 +3,9 @@ from django.db import migrations, models
 
 def update_link_buttons(apps, schema_editor):
     CustomLink = apps.get_model('extras', 'CustomLink')
-    CustomLink.objects.filter(button_class='outline-dark').update(button_class='default')
+    db_alias = schema_editor.connection.alias
+
+    CustomLink.objects.using(db_alias).filter(button_class='outline-dark').update(button_class='default')
 
 
 class Migration(migrations.Migration):

+ 5 - 3
netbox/extras/migrations/0117_move_objectchange.py

@@ -3,19 +3,21 @@ from django.db import migrations
 
 def update_content_types(apps, schema_editor):
     ContentType = apps.get_model('contenttypes', 'ContentType')
+    db_alias = schema_editor.connection.alias
 
     # Delete the new ContentTypes effected by the new model in the core app
-    ContentType.objects.filter(app_label='core', model='objectchange').delete()
+    ContentType.objects.using(db_alias).filter(app_label='core', model='objectchange').delete()
 
     # Update the app labels of the original ContentTypes for extras.ObjectChange to ensure that any
     # foreign key references are preserved
-    ContentType.objects.filter(app_label='extras', model='objectchange').update(app_label='core')
+    ContentType.objects.using(db_alias).filter(app_label='extras', model='objectchange').update(app_label='core')
 
 
 def update_dashboard_widgets(apps, schema_editor):
     Dashboard = apps.get_model('extras', 'Dashboard')
+    db_alias = schema_editor.connection.alias
 
-    for dashboard in Dashboard.objects.all():
+    for dashboard in Dashboard.objects.using(db_alias).all():
         for key, widget in dashboard.config.items():
             if widget['config'].get('model') == 'extras.objectchange':
                 widget['config']['model'] = 'core.objectchange'

+ 2 - 1
netbox/extras/migrations/0120_eventrule_event_types.py

@@ -6,8 +6,9 @@ from core.events import *
 
 def set_event_types(apps, schema_editor):
     EventRule = apps.get_model('extras', 'EventRule')
-    event_rules = EventRule.objects.all()
+    db_alias = schema_editor.connection.alias
 
+    event_rules = EventRule.objects.using(db_alias).all()
     for event_rule in event_rules:
         event_rule.event_types = []
         if event_rule.type_create:

+ 2 - 1
netbox/extras/migrations/0122_charfield_null_choices.py

@@ -6,8 +6,9 @@ def set_null_values(apps, schema_editor):
     Replace empty strings with null values.
     """
     CustomFieldChoiceSet = apps.get_model('extras', 'CustomFieldChoiceSet')
+    db_alias = schema_editor.connection.alias
 
-    CustomFieldChoiceSet.objects.filter(base_choices='').update(base_choices=None)
+    CustomFieldChoiceSet.objects.using(db_alias).filter(base_choices='').update(base_choices=None)
 
 
 class Migration(migrations.Migration):

+ 3 - 1
netbox/extras/migrations/0123_journalentry_kind_default.py

@@ -8,7 +8,9 @@ def set_kind_default(apps, schema_editor):
     Set kind to "info" on any entries with no kind assigned.
     """
     JournalEntry = apps.get_model('extras', 'JournalEntry')
-    JournalEntry.objects.filter(kind='').update(kind=JournalEntryKindChoices.KIND_INFO)
+    db_alias = schema_editor.connection.alias
+
+    JournalEntry.objects.using(db_alias).filter(kind='').update(kind=JournalEntryKindChoices.KIND_INFO)
 
 
 class Migration(migrations.Migration):

+ 3 - 1
netbox/ipam/migrations/0070_vlangroup_vlan_id_ranges.py

@@ -11,7 +11,9 @@ def set_vid_ranges(apps, schema_editor):
     Convert the min_vid & max_vid fields to a range in the new vid_ranges ArrayField.
     """
     VLANGroup = apps.get_model('ipam', 'VLANGroup')
-    for group in VLANGroup.objects.all():
+    db_alias = schema_editor.connection.alias
+
+    for group in VLANGroup.objects.using(db_alias).all():
         group.vid_ranges = [NumericRange(group.min_vid, group.max_vid, bounds='[]')]
         group._total_vlan_ids = group.max_vid - group.min_vid + 1
         group.save()

+ 4 - 2
netbox/ipam/migrations/0071_prefix_scope.py

@@ -9,9 +9,11 @@ def copy_site_assignments(apps, schema_editor):
     ContentType = apps.get_model('contenttypes', 'ContentType')
     Prefix = apps.get_model('ipam', 'Prefix')
     Site = apps.get_model('dcim', 'Site')
+    db_alias = schema_editor.connection.alias
 
-    Prefix.objects.filter(site__isnull=False).update(
-        scope_type=ContentType.objects.get_for_model(Site), scope_id=models.F('site_id')
+    Prefix.objects.using(db_alias).filter(site__isnull=False).update(
+        scope_type=ContentType.objects.get_for_model(Site),
+        scope_id=models.F('site_id')
     )
 
 

+ 3 - 2
netbox/ipam/migrations/0072_prefix_cached_relations.py

@@ -7,15 +7,16 @@ def populate_denormalized_fields(apps, schema_editor):
     Copy site ForeignKey values to the scope GFK.
     """
     Prefix = apps.get_model('ipam', 'Prefix')
+    db_alias = schema_editor.connection.alias
 
-    prefixes = Prefix.objects.filter(site__isnull=False).prefetch_related('site')
+    prefixes = Prefix.objects.using(db_alias).filter(site__isnull=False).prefetch_related('site')
     for prefix in prefixes:
         prefix._region_id = prefix.site.region_id
         prefix._site_group_id = prefix.site.group_id
         prefix._site_id = prefix.site_id
         # Note: Location cannot be set prior to migration
 
-    Prefix.objects.bulk_update(prefixes, ['_region', '_site_group', '_site'], batch_size=100)
+    Prefix.objects.using(db_alias).bulk_update(prefixes, ['_region', '_site_group', '_site'], batch_size=100)
 
 
 class Migration(migrations.Migration):

+ 3 - 2
netbox/ipam/migrations/0073_charfield_null_choices.py

@@ -7,9 +7,10 @@ def set_null_values(apps, schema_editor):
     """
     FHRPGroup = apps.get_model('ipam', 'FHRPGroup')
     IPAddress = apps.get_model('ipam', 'IPAddress')
+    db_alias = schema_editor.connection.alias
 
-    FHRPGroup.objects.filter(auth_type='').update(auth_type=None)
-    IPAddress.objects.filter(role='').update(role=None)
+    FHRPGroup.objects.using(db_alias).filter(auth_type='').update(auth_type=None)
+    IPAddress.objects.using(db_alias).filter(role='').update(role=None)
 
 
 class Migration(migrations.Migration):

+ 8 - 6
netbox/ipam/migrations/0080_populate_service_parent.py

@@ -2,36 +2,38 @@ from django.db import migrations
 from django.db.models import F
 
 
-def populate_service_parent_gfk(apps, schema_config):
+def populate_service_parent_gfk(apps, schema_editor):
     Service = apps.get_model('ipam', 'Service')
     ContentType = apps.get_model('contenttypes', 'ContentType')
     Device = apps.get_model('dcim', 'device')
     VirtualMachine = apps.get_model('virtualization', 'virtualmachine')
+    db_alias = schema_editor.connection.alias
 
-    Service.objects.filter(device_id__isnull=False).update(
+    Service.objects.using(db_alias).filter(device_id__isnull=False).update(
         parent_object_type=ContentType.objects.get_for_model(Device),
         parent_object_id=F('device_id'),
     )
 
-    Service.objects.filter(virtual_machine_id__isnull=False).update(
+    Service.objects.using(db_alias).filter(virtual_machine_id__isnull=False).update(
         parent_object_type=ContentType.objects.get_for_model(VirtualMachine),
         parent_object_id=F('virtual_machine_id'),
     )
 
 
-def repopulate_device_and_virtualmachine_relations(apps, schemaconfig):
+def repopulate_device_and_virtualmachine_relations(apps, schema_editor):
     Service = apps.get_model('ipam', 'Service')
     ContentType = apps.get_model('contenttypes', 'ContentType')
     Device = apps.get_model('dcim', 'device')
     VirtualMachine = apps.get_model('virtualization', 'virtualmachine')
+    db_alias = schema_editor.connection.alias
 
-    Service.objects.filter(
+    Service.objects.using(db_alias).filter(
         parent_object_type=ContentType.objects.get_for_model(Device),
     ).update(
         device_id=F('parent_object_id')
     )
 
-    Service.objects.filter(
+    Service.objects.using(db_alias).filter(
         parent_object_type=ContentType.objects.get_for_model(VirtualMachine),
     ).update(
         virtual_machine_id=F('parent_object_id')

+ 2 - 1
netbox/tenancy/migrations/0016_charfield_null_choices.py

@@ -6,8 +6,9 @@ def set_null_values(apps, schema_editor):
     Replace empty strings with null values.
     """
     ContactAssignment = apps.get_model('tenancy', 'ContactAssignment')
+    db_alias = schema_editor.connection.alias
 
-    ContactAssignment.objects.filter(priority='').update(priority=None)
+    ContactAssignment.objects.using(db_alias).filter(priority='').update(priority=None)
 
 
 class Migration(migrations.Migration):

+ 3 - 3
netbox/tenancy/migrations/0018_contact_groups.py

@@ -3,10 +3,10 @@ from django.db import migrations, models
 
 
 def migrate_contact_groups(apps, schema_editor):
-    Contacts = apps.get_model('tenancy', 'Contact')
+    Contact = apps.get_model('tenancy', 'Contact')
+    db_alias = schema_editor.connection.alias
 
-    qs = Contacts.objects.filter(group__isnull=False)
-    for contact in qs:
+    for contact in Contact.objects.using(db_alias).filter(group__isnull=False):
         contact.groups.add(contact.group)
 
 

+ 10 - 6
netbox/users/migrations/0005_alter_user_table.py

@@ -3,18 +3,22 @@ from django.db import migrations
 
 def update_content_types(apps, schema_editor):
     ContentType = apps.get_model('contenttypes', 'ContentType')
+    CustomField = apps.get_model('extras', 'CustomField')
+    db_alias = schema_editor.connection.alias
+
     # Delete the new ContentTypes effected by the new models in the users app
-    ContentType.objects.filter(app_label='users', model='user').delete()
+    ContentType.objects.using(db_alias).filter(app_label='users', model='user').delete()
 
     # Update the app labels of the original ContentTypes for auth.User to ensure
     # that any foreign key references are preserved
-    ContentType.objects.filter(app_label='auth', model='user').update(app_label='users')
+    ContentType.objects.using(db_alias).filter(app_label='auth', model='user').update(app_label='users')
 
-    netboxuser_ct = ContentType.objects.filter(app_label='users', model='netboxuser').first()
+    netboxuser_ct = ContentType.objects.using(db_alias).filter(app_label='users', model='netboxuser').first()
     if netboxuser_ct:
-        user_ct = ContentType.objects.filter(app_label='users', model='user').first()
-        CustomField = apps.get_model('extras', 'CustomField')
-        CustomField.objects.filter(related_object_type_id=netboxuser_ct.id).update(related_object_type_id=user_ct.id)
+        user_ct = ContentType.objects.using(db_alias).filter(app_label='users', model='user').first()
+        CustomField.objects.using(db_alias).filter(related_object_type_id=netboxuser_ct.id).update(
+            related_object_type_id=user_ct.id
+        )
         netboxuser_ct.delete()
 
 

+ 3 - 2
netbox/users/migrations/0006_custom_group_model.py

@@ -9,10 +9,11 @@ def update_custom_fields(apps, schema_editor):
     ContentType = apps.get_model('contenttypes', 'ContentType')
     CustomField = apps.get_model('extras', 'CustomField')
     Group = apps.get_model('users', 'Group')
+    db_alias = schema_editor.connection.alias
 
-    if old_ct := ContentType.objects.filter(app_label='users', model='netboxgroup').first():
+    if old_ct := ContentType.objects.using(db_alias).filter(app_label='users', model='netboxgroup').first():
         new_ct = ContentType.objects.get_for_model(Group)
-        CustomField.objects.filter(related_object_type=old_ct).update(related_object_type=new_ct)
+        CustomField.objects.using(db_alias).filter(related_object_type=old_ct).update(related_object_type=new_ct)
 
 
 class Migration(migrations.Migration):

+ 4 - 5
netbox/users/migrations/0009_update_group_perms.py

@@ -1,16 +1,15 @@
-# Generated by Django 5.0.5 on 2024-05-15 18:05
-
 from django.db import migrations, models
 
 
 def update_content_types(apps, schema_editor):
     ObjectType = apps.get_model('core', 'ObjectType')
     ObjectPermission = apps.get_model('users', 'ObjectPermission')
+    db_alias = schema_editor.connection.alias
 
-    auth_group_ct = ObjectType.objects.filter(app_label='auth', model='group').first()
-    users_group_ct = ObjectType.objects.filter(app_label='users', model='group').first()
+    auth_group_ct = ObjectType.objects.using(db_alias).filter(app_label='auth', model='group').first()
+    users_group_ct = ObjectType.objects.using(db_alias).filter(app_label='users', model='group').first()
     if auth_group_ct and users_group_ct:
-        perms = ObjectPermission.objects.filter(object_types__in=[auth_group_ct])
+        perms = ObjectPermission.objects.using(db_alias).filter(object_types__in=[auth_group_ct])
         for perm in perms:
             perm.object_types.remove(auth_group_ct)
             perm.object_types.add(users_group_ct)

+ 7 - 6
netbox/virtualization/migrations/0040_convert_disk_size.py

@@ -4,18 +4,19 @@ from netbox.settings import DISK_BASE_UNIT
 
 
 def convert_disk_size(apps, schema_editor):
+    VirtualDisk = apps.get_model('virtualization', 'VirtualDisk')
     VirtualMachine = apps.get_model('virtualization', 'VirtualMachine')
-    VirtualMachine.objects.filter(disk__isnull=False).update(disk=F('disk') * DISK_BASE_UNIT)
+    db_alias = schema_editor.connection.alias
 
-    VirtualDisk = apps.get_model('virtualization', 'VirtualDisk')
-    VirtualDisk.objects.filter(size__isnull=False).update(size=F('size') * DISK_BASE_UNIT)
+    VirtualMachine.objects.using(db_alias).filter(disk__isnull=False).update(disk=F('disk') * DISK_BASE_UNIT)
+    VirtualDisk.objects.using(db_alias).filter(size__isnull=False).update(size=F('size') * DISK_BASE_UNIT)
 
     # Recalculate disk size on all VMs with virtual disks
-    id_list = VirtualDisk.objects.values_list('virtual_machine_id').distinct()
-    virtual_machines = VirtualMachine.objects.filter(id__in=id_list)
+    id_list = VirtualDisk.objects.using(db_alias).values_list('virtual_machine_id').distinct()
+    virtual_machines = VirtualMachine.objects.using(db_alias).filter(id__in=id_list)
     for vm in virtual_machines:
         vm.disk = vm.virtualdisks.aggregate(Sum('size', default=0))['size__sum']
-    VirtualMachine.objects.bulk_update(virtual_machines, fields=['disk'])
+    VirtualMachine.objects.using(db_alias).bulk_update(virtual_machines, fields=['disk'])
 
 
 class Migration(migrations.Migration):

+ 2 - 1
netbox/virtualization/migrations/0041_charfield_null_choices.py

@@ -6,8 +6,9 @@ def set_null_values(apps, schema_editor):
     Replace empty strings with null values.
     """
     VMInterface = apps.get_model('virtualization', 'VMInterface')
+    db_alias = schema_editor.connection.alias
 
-    VMInterface.objects.filter(mode='').update(mode=None)
+    VMInterface.objects.using(db_alias).filter(mode='').update(mode=None)
 
 
 class Migration(migrations.Migration):

+ 4 - 2
netbox/virtualization/migrations/0044_cluster_scope.py

@@ -9,9 +9,11 @@ def copy_site_assignments(apps, schema_editor):
     ContentType = apps.get_model('contenttypes', 'ContentType')
     Cluster = apps.get_model('virtualization', 'Cluster')
     Site = apps.get_model('dcim', 'Site')
+    db_alias = schema_editor.connection.alias
 
-    Cluster.objects.filter(site__isnull=False).update(
-        scope_type=ContentType.objects.get_for_model(Site), scope_id=models.F('site_id')
+    Cluster.objects.using(db_alias).filter(site__isnull=False).update(
+        scope_type=ContentType.objects.get_for_model(Site),
+        scope_id=models.F('site_id')
     )
 
 

+ 3 - 2
netbox/virtualization/migrations/0045_clusters_cached_relations.py

@@ -7,15 +7,16 @@ def populate_denormalized_fields(apps, schema_editor):
     Copy the denormalized fields for _region, _site_group and _site from existing site field.
     """
     Cluster = apps.get_model('virtualization', 'Cluster')
+    db_alias = schema_editor.connection.alias
 
-    clusters = Cluster.objects.filter(site__isnull=False).prefetch_related('site')
+    clusters = Cluster.objects.using(db_alias).filter(site__isnull=False).prefetch_related('site')
     for cluster in clusters:
         cluster._region_id = cluster.site.region_id
         cluster._site_group_id = cluster.site.group_id
         cluster._site_id = cluster.site_id
         # Note: Location cannot be set prior to migration
 
-    Cluster.objects.bulk_update(clusters, ['_region', '_site_group', '_site'], batch_size=100)
+    Cluster.objects.using(db_alias).bulk_update(clusters, ['_region', '_site_group', '_site'], batch_size=100)
 
 
 class Migration(migrations.Migration):

+ 9 - 4
netbox/virtualization/migrations/0048_populate_mac_addresses.py

@@ -6,19 +6,24 @@ def populate_mac_addresses(apps, schema_editor):
     ContentType = apps.get_model('contenttypes', 'ContentType')
     VMInterface = apps.get_model('virtualization', 'VMInterface')
     MACAddress = apps.get_model('dcim', 'MACAddress')
+    db_alias = schema_editor.connection.alias
     vminterface_ct = ContentType.objects.get_for_model(VMInterface)
 
     mac_addresses = [
         MACAddress(
-            mac_address=vminterface.mac_address, assigned_object_type=vminterface_ct, assigned_object_id=vminterface.pk
+            mac_address=vminterface.mac_address,
+            assigned_object_type=vminterface_ct,
+            assigned_object_id=vminterface.pk
         )
-        for vminterface in VMInterface.objects.filter(mac_address__isnull=False)
+        for vminterface in VMInterface.objects.using(db_alias).filter(mac_address__isnull=False)
     ]
-    MACAddress.objects.bulk_create(mac_addresses, batch_size=100)
+    MACAddress.objects.using(db_alias).bulk_create(mac_addresses, batch_size=100)
 
     # TODO: Optimize interface updates
     for mac_address in mac_addresses:
-        VMInterface.objects.filter(pk=mac_address.assigned_object_id).update(primary_mac_address=mac_address)
+        VMInterface.objects.using(db_alias).filter(pk=mac_address.assigned_object_id).update(
+            primary_mac_address=mac_address
+        )
 
 
 class Migration(migrations.Migration):

+ 5 - 4
netbox/vpn/migrations/0006_charfield_null_choices.py

@@ -8,11 +8,12 @@ def set_null_values(apps, schema_editor):
     IKEPolicy = apps.get_model('vpn', 'IKEPolicy')
     IKEProposal = apps.get_model('vpn', 'IKEProposal')
     IPSecProposal = apps.get_model('vpn', 'IPSecProposal')
+    db_alias = schema_editor.connection.alias
 
-    IKEPolicy.objects.filter(mode='').update(mode=None)
-    IKEProposal.objects.filter(authentication_algorithm='').update(authentication_algorithm=None)
-    IPSecProposal.objects.filter(authentication_algorithm='').update(authentication_algorithm=None)
-    IPSecProposal.objects.filter(encryption_algorithm='').update(encryption_algorithm=None)
+    IKEPolicy.objects.using(db_alias).filter(mode='').update(mode=None)
+    IKEProposal.objects.using(db_alias).filter(authentication_algorithm='').update(authentication_algorithm=None)
+    IPSecProposal.objects.using(db_alias).filter(authentication_algorithm='').update(authentication_algorithm=None)
+    IPSecProposal.objects.using(db_alias).filter(encryption_algorithm='').update(encryption_algorithm=None)
 
 
 class Migration(migrations.Migration):

+ 6 - 5
netbox/wireless/migrations/0010_charfield_null_choices.py

@@ -7,12 +7,13 @@ def set_null_values(apps, schema_editor):
     """
     WirelessLAN = apps.get_model('wireless', 'WirelessLAN')
     WirelessLink = apps.get_model('wireless', 'WirelessLink')
+    db_alias = schema_editor.connection.alias
 
-    WirelessLAN.objects.filter(auth_cipher='').update(auth_cipher=None)
-    WirelessLAN.objects.filter(auth_type='').update(auth_type=None)
-    WirelessLink.objects.filter(auth_cipher='').update(auth_cipher=None)
-    WirelessLink.objects.filter(auth_type='').update(auth_type=None)
-    WirelessLink.objects.filter(distance_unit='').update(distance_unit=None)
+    WirelessLAN.objects.using(db_alias).filter(auth_cipher='').update(auth_cipher=None)
+    WirelessLAN.objects.using(db_alias).filter(auth_type='').update(auth_type=None)
+    WirelessLink.objects.using(db_alias).filter(auth_cipher='').update(auth_cipher=None)
+    WirelessLink.objects.using(db_alias).filter(auth_type='').update(auth_type=None)
+    WirelessLink.objects.using(db_alias).filter(distance_unit='').update(distance_unit=None)
 
 
 class Migration(migrations.Migration):