Flask MongoEngine - Как изменить базу данных?
У меня есть приложение Flask с Post
модель, которая охватывает несколько баз данных MongoDB (db1, db2, db3,...), поэтому мне нужно иметь возможность запрашивать разные базы данных.
я использую Flask-MongoEngine
расширение.
мой __init__.py
содержит следующую строку:db = MongoEngine(app)
И в config.py
Я имею:MONGODB_SETTINGS = {'DB': 'db1'}
Я попробовал следующее безуспешно:
- Изменить
connection
параметр вdb
объект как это:db.connection = mongoengine.connect('db2')
Это ничего не изменило. проведениеpost = Post.objects.all()
все еще бегал на оригинальной дб (db1
). - Создать псевдоним в
Post
учебный классmeta
как это:'db_alias': 'db1'
Затем я изменилconnection
параметр вdb
объект как это:db.connection = mongoengine.connect('db2', alias='db1')
Это действительно создаст связь сdb2
, но я не мог изменить его на другой БД. - Задавать
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
вместо этого, который заботится о маршрутизации запроса к правильному шарду. Имя базы данных одинаково на каждом шарде.