Flask MongoEngine - Как изменить базу данных?

У меня есть приложение Flask с Post модель, которая охватывает несколько баз данных MongoDB (db1, db2, db3,...), поэтому мне нужно иметь возможность запрашивать разные базы данных.
я использую Flask-MongoEngine расширение.

мой __init__.py содержит следующую строку:
db = MongoEngine(app)
И в config.py Я имею:
MONGODB_SETTINGS = {'DB': 'db1'}

Я попробовал следующее безуспешно:

  1. Изменить connection параметр в db объект как это:
    db.connection = mongoengine.connect('db2')
    Это ничего не изменило. проведение post = Post.objects.all() все еще бегал на оригинальной дб (db1).
  2. Создать псевдоним в Post учебный класс meta как это:
    'db_alias': 'db1'
    Затем я изменил connection параметр в db объект как это:
    db.connection = mongoengine.connect('db2', alias='db1')
    Это действительно создаст связь с db2, но я не мог изменить его на другой БД.
  3. Задавать MONGODB_SETTINGS в {'DB': 'db2'} а потом db = MongoEngine(app)
    Это не сработает

Кажется, когда-то модель в models.py был загружен (или подключен к БД), вы не можете изменить его подключение.
Это верно?
Как я могу изменить базы данных на той же модели?
РЕДАКТИРОВАТЬ: эквивалент Джанго является using параметр в ORM, который позволяет запрашивать разные БД для одной и той же модели.

1 ответ

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

Вы можете (временно) изменить базу данных, используемую экземпляром документа, на псевдоним, определенный в классе документа, вызвав switch_db метод по экземпляру:

Post.objects.all().switch('db1').save()

сохранит все документы в базе данных db1 если db1 был определен как db_alias в Post класс (в противном случае вы получите ConnectionError).

В качестве альтернативы существует несколько способов сделать начальную конфигурацию "динамической" и, например, учитывать переменные среды:

import os
app['MONGODB_SETTINGS'] = {'db': os.environ.get('DBNAME', 'db2')}

Тем не менее, из вашего комментария

Наша система использует несколько баз данных для размещения этой модели

кажется, что вы, вероятно, хотите Sharding, где MongoDB заботится о распределении коллекции по нескольким mongod экземпляры на нескольких машинах. В этом случае вы подключаетесь к mongos вместо этого, который заботится о маршрутизации запроса к правильному шарду. Имя базы данных одинаково на каждом шарде.

Другие вопросы по тегам