#python #mongodb #prolog #mongodump #mongorestore
Вопрос:
Сброс и восстановление базы данных mongo кажется довольно простым, когда вы все равно используете оболочку: вы просто используете команды mongorestore
и mongodump
. Но если я не ошибаюсь, эти команды требуют, чтобы вы покинули свою активную оболочку mongo.
Кроме того, при написании на Python или прологе у меня есть разные способы общения с монго. Я могу либо использовать PyMonogo, либо в моем случае я общаюсь через РосПролог. Оба могут выполнять команды оболочки mongo, но я не могу придумать способ выполнить что-то похожее на mongorestore
и mongodump
.
Конечно, я мог бы использовать os.system()
Python (или process_create/3
пролог) для выполнения команд оболочки, но это кажется очень уродливым, и я хотел бы избежать этого. Я также мог бы написать .bson-парсер сам, но действительно ли это необходимо? Неужели в оболочке монго действительно нет эквивалента?
Комментарии:
1. Нет, вам не нужна активная оболочка mongo.
mongorestore/mongodump
являются обычными автономными исполняемыми файлами, на самом деле другого способа их запуска нет. Вы не можете восстановить базу данных из оболочки mongo.2. Не могли бы вы подтвердить, хотите ли вы восстановить из mongo sell или из скрипта python? Вы начали с вопроса об интерактивной оболочке mongo и закончили обходным путем из системного вызова python.
3. Я хочу восстановить его из скрипта python, предпочтительно с помощью PyMongo.
4. Насколько я понимаю, PyMongo тоже может выполнять все, что может оболочка mongo
5. Оболочка Mongo — это интерактивная среда javascript. Он поставляется с собственным набором утилит и вспомогательных функций, которые могут отличаться от того, что доступно в PyMongo.
Ответ №1:
mongodump и mongorestore-это утилиты уровня операционной системы, написанные на языке golang https://github.com/mongodb/mongo-tools. Вам действительно нужно запускать их за пределами оболочки монго.
Рекомендуемый способ-использовать стандартные mongodump и mongorestore в качестве подпроцессов, но там нет магии, и вы можете сделать то же самое в Python.
От https://jira.mongodb.org/browse/PYTHON-664:
from bson import BSON, decode_all
from pymongo import MongoClient
client = MongoClient()
source_collection = client.db.collection
# Dump.
with open('file.bson', 'wb ') as f:
for doc in source_collection.find():
f.write(BSON.encode(doc))
# Restore.
target_collection = client.db.collection2
with open('file.bson', 'rb') as f:
target_collection.insert(decode_all(f.read()))
Это будет не так эффективно, резервные копии не будут совместимы со стандартными резервными копиями, и вы можете пропустить некоторые крайние случаи без сброса oplog.
Ответ №2:
Это решение на python работает в Windows и Linux; конечно, оно немного хакерское, но вряд ли уродливое.
import subprocess
output = subprocess.run(['mongodump', '--uri', 'mongodb://localhost', '--readPreference', 'primary'], capture_output=True)
print(output)
Добавьте любые дополнительные параметры, которые вам нужны, например f'--archive={my_file}'