python mongodb
Общий план
При изучении темы DevOps попробую сделать простую программу телеграм бота на Python с базой данных MongoDB в докер контейнерах и развернуть все это с помощью docker-compose. Без погружения в разработку простой код, для экспериментов с CI
- Поднять базу данных MongoDB
- Понять основной синтаксис в консоли mongo
- Подключение и управление базой через Python
- Бэкапы перенос базы данных
- Телеграм бот работа с базой данных
- Создание контейнера с приложением Python
- Создать docker-compose с кодом программы и базой
Знакомства с NoSQL базой данных MongoDB
1. Установка и подготовка
Пробую впервые, для начало нужно понять общий синтаксис, научиться создавать базы, таблицы, добавлять, удалять и искать значения.
Для ознакомления поднимаю mongodb в docker
docker pull mongo
docker run --name mongodb -d -p 27017:27017 mongo
Для визуального наблюдения буду использовать GUI for MongoDB — Compass на Windows 10 ссылка на официальный сайт
Для подключения к базе использую адрес и порт в Compass mongodb://10.127.0.120:27017
Данная программа для удобства мониторинга и визуального представления. Для управления буду использовать CLI и необходимо войти внутрь контейнера
docker exec -it mongodb bash
2. Изучение основных команд
Внутри Docker mongodb запускаю mongo для перехода в консоль управления базой
show dbs #показать базы данных
use testdb #переключиться на базу данных "testdb" если нет создает её
db.createCollection("users");
#Создать коллекцию (таблицу) users
Для начало попробую создать базу данных пользователей, мне понадобится имя пользователя и его чат ID в боте
db.users.insert({name: "Artur", chatid: "5486178"});
db.users.insert({name: "Rinat", chatid: "3472583"});
Смотрю что получилось в Compass
Все по плану, иду дальше
db.users.find() #показать коллекцию users
db.users.find({name:"Artur"}) # поиск по name
Далее попробовал добавить еще раз эти же данные, база позволяет хотелось бы, чтоб не повторялись значения. Для этого делаю поле chatid уникальным
db.users.createIndex( { "chatid": 1 }, { unique: true } )
Теперь при добавлении с таким же chatid получаю ошибку
«errmsg» : «E11000 duplicate key error collection: testdb.users index: chatid_1 dup key: { chatid: \»5486178\» }»
db.users.createIndex( { name: 1, chatid: 1 }, { unique: true } )
# Уникальные имена и чатИД
db.users.dropIndex( { name: 1, chatid: 1 }, { unique: true } )
# Удалить индекс уникальных имен и чатИД
Сохранение или удаление команда save Если есть такое значение он его обноавляет (update) если нет создает (insert)
db.users.save({name: "Andrei", chatid: "123344"});
Поиск в базе где chatid содержит цифры «54»
db.users.find({"chatid" : {$regex : ".*54.*"}});
db.users.find().limit(2); #Первые 2 записи
db.users.count(); #Количество записей
Сведения информация статистика
# Получить статистику коллекций
db.<collectionName>.stats()
db.printCollectionStats()
# Статистика задержек для операций чтения, записи, включая среднее время,
# затраченное на чтение, запись и связанное с ним количество выполненных операций
db.<collectionName>.latencyStats()
# Получить размер коллекции для данных и индексов
db.<collectionName>.dataSize() # Размер коллекциии
db.<collectionName>.storageSize() # Общий вес коллекции на диске
db.<collectionName>.totalSize() # Общий размер в байтах как для данных сбора, так и для индексов
db.<collectionName>.totalIndexSize() # Общий размер всех индексов в коллекции
3. Связка с Python
Установка библиотеки pymongo
pip install pymongo
Подключение к серверы базы MongoDB
from pymongo import MongoClient
client = MongoClient('10.127.0.120', 27017)
db = client['testdb']
users = db['users']
Показать все записии в коллекции
for x in users.find():
print(x)
for x in users.find():
name = x['name']
chatid = x['chatid']
print(f'{name} - {chatid}')
#Вывод из словаря
Поиск по имени
result = users.find_one({'name': 'Artur'})
print(result)
#Получить chatid пользователя с именем Artur
result = users.find_one({'name': 'Artur'})
print(result['chatid'])
Добавление пользователя
user_data = {
"name": "Aleksin",
"chatid": "1254866",
}
result = users.insert_one(user_data)
print(f"Add ID: {result.inserted_id}")
Редактирование изменение данных
findName = {'name': 'Artur'}
changeid = {"$set": {'chatid': '1227777'}}
users.update_one(findName, changeid)
Самые простые и основные команды изучены, синтаксис примерно понятен. Можно приступать к созданию телеграм бота.