Django multidb: запись в несколько баз данных

С Django multidb довольно легко написать маршрутизатор, на котором запущена инфраструктура ведущего / ведомого. Но можно ли написать маршрутизатор, который пишет в несколько баз данных? Мой вариант использования – это набор проектов, все из которых работают в одном домене. Чтобы сохранить пользователей от регистрации / входа на сайт на каждом сайте, я хотел бы синхронизировать таблицы contrib.auth и contrib.sessions . Возможно ли это с Django multidb или я должен искать функции репликации системы баз данных (MySQL в моем случае)?

3 Solutions collect form web for “Django multidb: запись в несколько баз данных”

Сейчас я работаю над схемой shanging Django.

Я посмотрел на маршрутизатор Django, но решил бросить свой собственный.

некоторые мысли по вашей проблеме:

  1. Одна из идей состоит в том, чтобы использовать одну базу данных, а затем копировать соответствующие данные с помощью сигналов Django после post-save.

что-то вроде–

 import settings.databases as dbs_list def post_save_function(UserModel): for db in dbs_list: UserModel.save(using=db,force_insert=True) 

Сохранение объектов пользователя (по крайней мере, на модели с одной БД), похоже, сохраняет данные сеанса, auth и т. д. под капотом через различные магии, возникающие внутри django.contrib, поэтому есть вероятность, что вам, возможно, не придется входить и выяснять имена и типы всех этих таблиц базы данных.

в поддержку возможности этой работы, клянусь, я кое-что прочитал (вероятно, на одном из сообщений в блоге Alex Gaynor), что если у объекта есть внешний ключ, Django попытается использовать тот же БД, на котором живет объект (по очевидным причинам в свет того, как обычно работает Django).

  1. другая идея:

из примера на странице Django multiDB, на которую вы ссылаетесь, интересно, будет ли что-то вроде следующего работать:

их пример кода:

 def allow_syncdb(self, db, model): "Explicitly put all models on all databases." return True 

возможная модификация:

def allow_syncdb (self, db, model):

  if isinstance(model,User): return True elif isinstance(model,Session): return True else: ''' something appropriate -- whatever your sharding schema is for other objects ''' 

снова посмотрев на это, этот код, вероятно, будет более полезен как функция «db_for_write». Но ты получил идею.

нет никаких сомнений в других типах моделей, которые вам пришлось бы добавить, чтобы сделать эту работу (весь материал auth, который является обширным).

удачи! надеюсь, что это поможет в некотором роде.

Я заинтересован в ваших выводах и комментариях!

ДБ

я думаю, что вам лучше реализовать службу единого входа или службы OAuth

но если вы хотите, чтобы синхронизировать пользователей таблиц между двумя базами данных, и если вы используете свой собственный UserModel, вы можете сделать что-то вроде этого

 class MyUser(models.Model): name = models.CharField(max_length=100) user = models.ForeignKey(User, unique=True) def save(self, ...): # ALL the signature super(MyUser, self).save(using='database_1') super(MyUser, self).save(using='database_2') 

вы можете также разместить с таким декоратором, как это, вы также можете использовать его для синхронизации других таблиц:

 def save_multi_db(model_class): def save_wrapper(save_func): def new_save(self, *args, **kws): super(model_class, self).save(using='database_1') super(model_class, self).save(using='database_1') return new_save func = getattr(model_class, 'save') setattr(model_class, 'save', save_wrapper(func)) return save_wrapper # and use it like this: @save_multi_db class MyUser(models.Model): .... 

Надеюсь, это поможет 🙂

Во-первых, я думаю, что вам больше нужна структура единого входа, как в этом сообщении

Я попробовал ответ муада, но я не смог заставить классного декоратора работать … И мне кажется, что это решение не позволяет создавать пользовательские save () в моделях.

Более подходящий для моей потребности, я определил собственный универсальный класс и просто переопределяю функцию save ().

 class MultiDbModel(models.Model): class Meta: abstract = True def save(self, *args, **kwarg for dbname in settings.DATABASES: super(MultiDbModel, self).save(using=dbname) 

А потом:

 class MyObject(MultiDbModel): [...] def save(self, *args, **kwargs): [custom save] super(MyObject, self).save(args, kwargs) 
  • Объемное обновление Django с заменой строки
  • Как реализовать последователей / следующих в Django
  • Django ORM - .update (...) с дополнительными (...) и F (...)
  • Есть ли библиотека для сравнения моих приложений Django для SQL?
  • Аргумент TypeError: int () должен быть строкой или числом, а не 'datetime.datetime'
  • Поле модели Django Blob
  • Могу ли я контролировать GROUP BY в орфографии django 1.3?
  • Django: сумма атрибута даты, сгруппированного по месяцам / годам
  • Python - лучший язык программирования в мире.