Add MongoDB support
This commit is contained in:
+6
-1
@@ -21,4 +21,9 @@ AGE_GRAPH_NAME=movie_graph
|
|||||||
INFLUX_ACTIVE=false
|
INFLUX_ACTIVE=false
|
||||||
INFLUXDB3_HOST=http://localhost:8181
|
INFLUXDB3_HOST=http://localhost:8181
|
||||||
INFLUXDB3_AUTH_TOKEN=your_token
|
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 — графовая БД
|
- Neo4j — графовая БД
|
||||||
- Apache AGE — графовая БД в рамках PostgreSQL
|
- Apache AGE — графовая БД в рамках PostgreSQL
|
||||||
- InfluxDB 3 Core — БД временных рядов
|
- InfluxDB 3 Core — БД временных рядов
|
||||||
|
- MongoDB (pymongo) — документ-ориентированная БД
|
||||||
|
|
||||||
### Скриншоты
|
### Скриншоты
|
||||||
|
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
- Установленный Neo4j и загруженный обучающий граф фильмов (Movie Graph example)
|
- Установленный Neo4j и загруженный обучающий граф фильмов (Movie Graph example)
|
||||||
- Для Apache AGE: установленное расширение `age` в PostgreSQL и доступ к базе, где оно включено
|
- Для Apache AGE: установленное расширение `age` в PostgreSQL и доступ к базе, где оно включено
|
||||||
- Для InfluxDB 3 Core: запущенный сервер, заранее созданная база и токен с правами на запись и чтение
|
- Для InfluxDB 3 Core: запущенный сервер, заранее созданная база и токен с правами на запись и чтение
|
||||||
|
- Для MongoDB: запущенный MongoDB сервер и доступ к целевой базе
|
||||||
|
|
||||||
### Настройка окружения
|
### Настройка окружения
|
||||||
|
|
||||||
@@ -60,6 +62,11 @@ INFLUX_ACTIVE=false # включить InfluxDB 3 Core, установив tru
|
|||||||
INFLUXDB3_HOST=http://localhost:8181
|
INFLUXDB3_HOST=http://localhost:8181
|
||||||
INFLUXDB3_AUTH_TOKEN=your_token
|
INFLUXDB3_AUTH_TOKEN=your_token
|
||||||
INFLUXDB3_DATABASE=sensors
|
INFLUXDB3_DATABASE=sensors
|
||||||
|
|
||||||
|
MONGO_ACTIVE=false # включить MongoDB, установив true
|
||||||
|
MONGO_URI=mongodb://localhost:27017
|
||||||
|
MONGO_DB=movie_data
|
||||||
|
MONGO_COLLECTION=movies
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Создайте и активируйте виртуальное окружение:
|
2. Создайте и активируйте виртуальное окружение:
|
||||||
@@ -94,4 +101,4 @@ pip install -r requirements.txt
|
|||||||
py main.py
|
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 os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
@@ -10,6 +11,8 @@ from psycopg2.errors import DuplicateDatabase
|
|||||||
from PyQt5.QtCore import QSize, Qt
|
from PyQt5.QtCore import QSize, Qt
|
||||||
from PyQt5.QtWidgets import QApplication, QGridLayout, QHeaderView, QMainWindow, QTableWidget, QTableWidgetItem, QWidget
|
from PyQt5.QtWidgets import QApplication, QGridLayout, QHeaderView, QMainWindow, QTableWidget, QTableWidgetItem, QWidget
|
||||||
|
|
||||||
|
MongoClient = importlib.import_module("pymongo").MongoClient
|
||||||
|
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
|
|
||||||
POSTGRES_USER = os.getenv("POSTGRES_USER")
|
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_AUTH_TOKEN = os.getenv("INFLUXDB3_AUTH_TOKEN")
|
||||||
INFLUXDB3_DATABASE = os.getenv("INFLUXDB3_DATABASE", "sensors")
|
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 = [
|
USER_SEED_DATA = [
|
||||||
(1, "Ivan", 15),
|
(1, "Ivan", 15),
|
||||||
(2, "Igor", 22),
|
(2, "Igor", 22),
|
||||||
@@ -203,6 +211,34 @@ ORDER BY time, measurement
|
|||||||
return headers, values
|
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():
|
def load_users():
|
||||||
admin_conn = connect_postgres("postgres")
|
admin_conn = connect_postgres("postgres")
|
||||||
try:
|
try:
|
||||||
@@ -378,4 +414,18 @@ if __name__ == "__main__":
|
|||||||
except Exception as error:
|
except Exception as error:
|
||||||
print(f"InfluxDB 3 Core load failed: {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())
|
sys.exit(app.exec())
|
||||||
@@ -3,3 +3,4 @@ neo4j
|
|||||||
PyQt5
|
PyQt5
|
||||||
python-dotenv
|
python-dotenv
|
||||||
influxdb3-python
|
influxdb3-python
|
||||||
|
pymongo
|
||||||
|
|||||||
Reference in New Issue
Block a user