#python #sql-server #django #django-migrations
Вопрос:
Я новый пользователь Django, и у меня, похоже, возникли некоторые проблемы с созданием таблиц с помощью миграции Django в мою устаревшую базу данных (SQL Server). В принципе, у меня есть 3 устаревшие базы данных (comp1_db, comp2_db, comp3_db), в которых я настроил маршрутизацию следующим образом (в основном одинаковую для каждой):
**db_routers.py**
class comp1Router:
route_app_labels = {'contenttypes','shared_invoice_detail'}
def db_for_read(self, model, **hints):
if model._meta.app_label in self.route_app_labels:
return 'comp1_db'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label in self.route_app_labels:
return 'comp1_db'
return None
def allow_relation(self, obj1, obj2, **hints):
if (
obj1._meta.app_label in self.route_app_labels or
obj2._meta.app_label in self.route_app_labels
):
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label in self.route_app_labels:
return db == 'comp1_db'
return None
class comp2Router:
route_app_labels = {'contenttypes','shared_invoice_detail'}
def db_for_read(self, model, **hints):
if model._meta.app_label in self.route_app_labels:
return 'comp2_db'
return None
def db_for_write(self, model, **hints):
"""
Attempts to write auth and contenttypes models go to auth_db.
"""
if model._meta.app_label in self.route_app_labels:
return 'comp2_db'
return None
def allow_relation(self, obj1, obj2, **hints):
if (
obj1._meta.app_label in self.route_app_labels or
obj2._meta.app_label in self.route_app_labels
):
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label in self.route_app_labels:
return db == 'comp2_db'
return None
class comp3Router:
route_app_labels = {'contenttypes','shared_invoice_detail'}
def db_for_read(self, model, **hints):
if model._meta.app_label in self.route_app_labels:
return 'comp3_db'
return None
def db_for_write(self, model, **hints):
"""
Attempts to write auth and contenttypes models go to auth_db.
"""
if model._meta.app_label in self.route_app_labels:
return 'comp3_db'
return None
def allow_relation(self, obj1, obj2, **hints):
if (
obj1._meta.app_label in self.route_app_labels or
obj2._meta.app_label in self.route_app_labels
):
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label in self.route_app_labels:
return db == 'comp3_db'
return None
**settings.py** router section
DATABASE_ROUTERS = ['routers.db_routers.comp1Router',
'routers.db_routers.comp2Router',
'routers.db_routers.comp3Router',
]
**models.py** (part of it)
class DJ_ArInvoiceHandover(models.Model):
document_no = models.CharField(db_column='Document No', primary_key=True, max_length=20) # Field name made lowercase. Field renamed to remove unsuitable characters.
transaction_type = models.CharField(db_column='Transaction Type', max_length=10, default= 'INV' ) # Field name made lowercase. Field renamed to remove unsuitable characters.
limit = models.Q(app_label = 'shared_invoice_detail', model='ArInvoiceMain')|models.Q(app_label = 'shared_invoice_detail', model='ArInvoiceMainHist')
content_type = models.ForeignKey(ContentType, limit_choices_to = limit, on_delete=models.CASCADE, default='')
content_object = GenericForeignKey('content_type', 'document_no')
handover_by = models.CharField(db_column='Handover By', max_length=20, blank=True, null=False, default='')
handover_datetime = models.DateTimeField(db_column='Handover DateTime', blank=True, null=True)
last_updated = models.DateTimeField(db_column = 'Last Updated', auto_now=True)
def __str_(self):
return self.document_no
class Meta:
managed = True
db_table = 'DJ_AR_Invoice_Handover'
У меня нет проблем с чтением данных из всех 3 баз данных, но когда я пытаюсь создать новую модель (следовательно, таблицу) во всех 3 базах данных, и все, кажется, работает нормально. Однако я вижу только таблицу, созданную в базе данных comp1. Я теряюсь в том, в чем проблема …..Любая помощь в этом вопросе очень ценится, спасибо.
python manage.py makemigrations
python manage.py migrate --database=comp1_db (I repeat for comp2 and comp3)
....
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
Applying shared_invoice_detail.0001_initial... OK
Applying shared_invoice_detail.0002_dj_arinvoicehandover... OK
Комментарии:
1. Вы читали это? docs.djangoproject.com/en/3.2/howto/legacy-databases . А также, пожалуйста, поделитесь своими моделями
2. Привет, да, я читал это раньше и убедился, что класс моей модели meta managed=True. Я также включил модель, которую пытаюсь перенести в базу данных. Я не могу поделиться всем, потому что их слишком много.