TLTR: Django не поддерживает имена базы данных в SQL-запросах, могу ли я как-то заставить это сделать это или есть обходное решение?
Длинная версия:
У меня есть две устаревшие базы данных MySQL (Примечание: я не влияю на макет БД), для которого я создаю API для чтения только. > с использованием DRF на Django 1.11 и python 3.6
Я работаю над ограничением ссылочной целостности для БД MyISAM, используя поле SpanningForeignKey, предложенное здесь: qaru.site/info/75234/...
Я пытаюсь подключить таблицу из DB1 к таблице из DB2 через ManyToMany через таблицу в DB1. Создание запроса Django:
SELECT "table_b"."id" FROM "table_b" INNER JOIN "throughtable" ON ("table_b"."id" = "throughtable"."b_id") WHERE "throughtable"."b_id" = 12345
Что, конечно, дает мне ошибку "Таблица" DB2.thropable "не существует", потому что сквозной столбец находится в DB1, и я не знаю, как заставить Django префикс таблиц с именем DB. Запрос должен быть:
SELECT table_b.id FROM DB2.table_b INNER JOIN DB1.throughtable ON (table_b.id = throughtable.b_id) WHERE throughtable.b_id = 12345
Модели для app1 db1_app/models.py
: (DB1)
class TableA(models.Model):
id = models.AutoField(primary_key=True)
# some other fields
relations = models.ManyToManyField(TableB, through='Throughtable')
class Throughtable(models.Model):
id = models.AutoField(primary_key=True)
a_id = models.ForeignKey(TableA, to_field='id')
b_id = SpanningForeignKey(TableB, db_constraint=False, to_field='id')
Модели для app2 db2_app/models.py
: (DB2)
class TableB(models.Model):
id = models.AutoField(primary_key=True)
# some other fields
База данных маршрутизатор:
def db_for_read(self, model, **hints):
if model._meta.app_label == 'db1_app':
return 'DB1'
if model._meta.app_label == 'db2_app':
return 'DB2'
return None
Могу ли я заставить Django включать имя базы данных в запрос? Или есть ли обходной путь для этого?