Add MongoDB support
This commit is contained in:
+6
-1
@@ -21,4 +21,9 @@ AGE_GRAPH_NAME=movie_graph
|
||||
INFLUX_ACTIVE=false
|
||||
INFLUXDB3_HOST=http://localhost:8181
|
||||
INFLUXDB3_AUTH_TOKEN=your_token
|
||||
INFLUXDB3_DATABASE=sensors
|
||||
INFLUXDB3_DATABASE=sensors
|
||||
|
||||
MONGO_ACTIVE=false
|
||||
MONGO_URI=mongodb://localhost:27017
|
||||
MONGO_DB=movie_data
|
||||
MONGO_COLLECTION=movies
|
||||
@@ -1,6 +1,6 @@
|
||||
### Пример приложения для работы с БД
|
||||
|
||||
Небольшое десктоп-приложение на PyQt5 для работы с PostgreSQL, Neo4j, Apache AGE и InfluxDB 3 Core.
|
||||
Небольшое десктоп-приложение на PyQt5 для работы с PostgreSQL, Neo4j, Apache AGE, InfluxDB 3 Core и MongoDB.
|
||||
|
||||
### Стек
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
- Neo4j — графовая БД
|
||||
- Apache AGE — графовая БД в рамках PostgreSQL
|
||||
- InfluxDB 3 Core — БД временных рядов
|
||||
- MongoDB (pymongo) — документ-ориентированная БД
|
||||
|
||||
### Скриншоты
|
||||
|
||||
@@ -27,6 +28,7 @@
|
||||
- Установленный Neo4j и загруженный обучающий граф фильмов (Movie Graph example)
|
||||
- Для Apache AGE: установленное расширение `age` в PostgreSQL и доступ к базе, где оно включено
|
||||
- Для InfluxDB 3 Core: запущенный сервер, заранее созданная база и токен с правами на запись и чтение
|
||||
- Для MongoDB: запущенный MongoDB сервер и доступ к целевой базе
|
||||
|
||||
### Настройка окружения
|
||||
|
||||
@@ -60,6 +62,11 @@ INFLUX_ACTIVE=false # включить InfluxDB 3 Core, установив tru
|
||||
INFLUXDB3_HOST=http://localhost:8181
|
||||
INFLUXDB3_AUTH_TOKEN=your_token
|
||||
INFLUXDB3_DATABASE=sensors
|
||||
|
||||
MONGO_ACTIVE=false # включить MongoDB, установив true
|
||||
MONGO_URI=mongodb://localhost:27017
|
||||
MONGO_DB=movie_data
|
||||
MONGO_COLLECTION=movies
|
||||
```
|
||||
|
||||
2. Создайте и активируйте виртуальное окружение:
|
||||
@@ -94,4 +101,4 @@ pip install -r requirements.txt
|
||||
py main.py
|
||||
```
|
||||
|
||||
Для PostgreSQL, Neo4j, Apache AGE и InfluxDB 3 Core запросы также выполняются только при `*_ACTIVE=true`.
|
||||
Для PostgreSQL, Neo4j, Apache AGE, InfluxDB 3 Core и MongoDB запросы выполняются только при `*_ACTIVE=true`.
|
||||
@@ -1,3 +1,4 @@
|
||||
import importlib
|
||||
import os
|
||||
import sys
|
||||
|
||||
@@ -10,6 +11,8 @@ from psycopg2.errors import DuplicateDatabase
|
||||
from PyQt5.QtCore import QSize, Qt
|
||||
from PyQt5.QtWidgets import QApplication, QGridLayout, QHeaderView, QMainWindow, QTableWidget, QTableWidgetItem, QWidget
|
||||
|
||||
MongoClient = importlib.import_module("pymongo").MongoClient
|
||||
|
||||
load_dotenv()
|
||||
|
||||
POSTGRES_USER = os.getenv("POSTGRES_USER")
|
||||
@@ -37,6 +40,11 @@ INFLUXDB3_HOST = os.getenv("INFLUXDB3_HOST", "http://localhost:8181")
|
||||
INFLUXDB3_AUTH_TOKEN = os.getenv("INFLUXDB3_AUTH_TOKEN")
|
||||
INFLUXDB3_DATABASE = os.getenv("INFLUXDB3_DATABASE", "sensors")
|
||||
|
||||
MONGO_ACTIVE = os.getenv("MONGO_ACTIVE", "false").lower() == "true"
|
||||
MONGO_URI = os.getenv("MONGO_URI", "mongodb://localhost:27017")
|
||||
MONGO_DB = os.getenv("MONGO_DB", "movie_data")
|
||||
MONGO_COLLECTION = os.getenv("MONGO_COLLECTION", "movies")
|
||||
|
||||
USER_SEED_DATA = [
|
||||
(1, "Ivan", 15),
|
||||
(2, "Igor", 22),
|
||||
@@ -203,6 +211,34 @@ ORDER BY time, measurement
|
||||
return headers, values
|
||||
|
||||
|
||||
def connect_mongo():
|
||||
return MongoClient(MONGO_URI)
|
||||
|
||||
|
||||
def insert_mongo_movies(collection):
|
||||
if collection.count_documents({}) > 0:
|
||||
print("MongoDB collection is already seeded.")
|
||||
return
|
||||
|
||||
collection.insert_many(
|
||||
[
|
||||
{"title": "Apollo 13", "released": 1995},
|
||||
{"title": "The Matrix", "released": 1999},
|
||||
{"title": "Toy Story", "released": 1995},
|
||||
{"title": "Alien", "released": 1979},
|
||||
]
|
||||
)
|
||||
print("MongoDB movies inserted.")
|
||||
|
||||
|
||||
def select_mongo_movies(collection):
|
||||
cursor = collection.find(
|
||||
{"released": {"$gte": 1990, "$lt": 2000}},
|
||||
{"_id": 0, "title": 1},
|
||||
).sort("title", 1)
|
||||
return [document["title"] for document in cursor]
|
||||
|
||||
|
||||
def load_users():
|
||||
admin_conn = connect_postgres("postgres")
|
||||
try:
|
||||
@@ -378,4 +414,18 @@ if __name__ == "__main__":
|
||||
except Exception as error:
|
||||
print(f"InfluxDB 3 Core load failed: {error}")
|
||||
|
||||
if MONGO_ACTIVE:
|
||||
try:
|
||||
with connect_mongo() as mongo_client:
|
||||
movies_collection = mongo_client[MONGO_DB][MONGO_COLLECTION]
|
||||
insert_mongo_movies(movies_collection)
|
||||
mongo_movies = select_mongo_movies(movies_collection)
|
||||
|
||||
mongo_window = DataWindow("mongodb", ["Info"], main_window, len(graph_windows))
|
||||
mongo_window.load_data([(title,) for title in mongo_movies])
|
||||
mongo_window.show()
|
||||
graph_windows.append(mongo_window)
|
||||
except Exception as error:
|
||||
print(f"MongoDB load failed: {error}")
|
||||
|
||||
sys.exit(app.exec())
|
||||
@@ -3,3 +3,4 @@ neo4j
|
||||
PyQt5
|
||||
python-dotenv
|
||||
influxdb3-python
|
||||
pymongo
|
||||
|
||||
Reference in New Issue
Block a user