Add Redis support
This commit is contained in:
@@ -27,3 +27,9 @@ MONGO_ACTIVE=false
|
|||||||
MONGO_URI=mongodb://localhost:27017
|
MONGO_URI=mongodb://localhost:27017
|
||||||
MONGO_DB=movie_data
|
MONGO_DB=movie_data
|
||||||
MONGO_COLLECTION=movies
|
MONGO_COLLECTION=movies
|
||||||
|
|
||||||
|
REDIS_ACTIVE=false
|
||||||
|
REDIS_HOST=localhost
|
||||||
|
REDIS_PORT=6379
|
||||||
|
REDIS_DB=0
|
||||||
|
REDIS_PASS=
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
### Пример приложения для работы с БД
|
### Пример приложения для работы с БД
|
||||||
|
|
||||||
Небольшое десктоп-приложение на PyQt5 для работы с PostgreSQL, Neo4j, Apache AGE, InfluxDB 3 Core и MongoDB.
|
Небольшое десктоп-приложение на PyQt5 для работы с PostgreSQL, Neo4j, Apache AGE, InfluxDB 3 Core, MongoDB и Redis.
|
||||||
|
|
||||||
### Стек
|
### Стек
|
||||||
|
|
||||||
@@ -10,6 +10,7 @@
|
|||||||
- Apache AGE — графовая БД в рамках PostgreSQL
|
- Apache AGE — графовая БД в рамках PostgreSQL
|
||||||
- InfluxDB 3 Core — БД временных рядов
|
- InfluxDB 3 Core — БД временных рядов
|
||||||
- MongoDB (pymongo) — документ-ориентированная БД
|
- MongoDB (pymongo) — документ-ориентированная БД
|
||||||
|
- Redis (redis-py) — in-memory key-value БД
|
||||||
|
|
||||||
### Скриншоты
|
### Скриншоты
|
||||||
|
|
||||||
@@ -29,6 +30,7 @@
|
|||||||
- Для Apache AGE: установленное расширение `age` в PostgreSQL и доступ к базе, где оно включено
|
- Для Apache AGE: установленное расширение `age` в PostgreSQL и доступ к базе, где оно включено
|
||||||
- Для InfluxDB 3 Core: запущенный сервер, заранее созданная база и токен с правами на запись и чтение
|
- Для InfluxDB 3 Core: запущенный сервер, заранее созданная база и токен с правами на запись и чтение
|
||||||
- Для MongoDB: запущенный MongoDB сервер и доступ к целевой базе
|
- Для MongoDB: запущенный MongoDB сервер и доступ к целевой базе
|
||||||
|
- Для Redis: запущенный Redis сервер и доступ к нему
|
||||||
|
|
||||||
### Настройка окружения
|
### Настройка окружения
|
||||||
|
|
||||||
@@ -67,6 +69,12 @@ MONGO_ACTIVE=false # включить MongoDB, установив true
|
|||||||
MONGO_URI=mongodb://localhost:27017
|
MONGO_URI=mongodb://localhost:27017
|
||||||
MONGO_DB=movie_data
|
MONGO_DB=movie_data
|
||||||
MONGO_COLLECTION=movies
|
MONGO_COLLECTION=movies
|
||||||
|
|
||||||
|
REDIS_ACTIVE=false # включить Redis, установив true
|
||||||
|
REDIS_HOST=localhost
|
||||||
|
REDIS_PORT=6379
|
||||||
|
REDIS_DB=0
|
||||||
|
REDIS_PASS=
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Создайте и активируйте виртуальное окружение:
|
2. Создайте и активируйте виртуальное окружение:
|
||||||
@@ -101,4 +109,4 @@ pip install -r requirements.txt
|
|||||||
py main.py
|
py main.py
|
||||||
```
|
```
|
||||||
|
|
||||||
Для PostgreSQL, Neo4j, Apache AGE, InfluxDB 3 Core и MongoDB запросы выполняются только при `*_ACTIVE=true`.
|
Для PostgreSQL, Neo4j, Apache AGE, InfluxDB 3 Core, MongoDB и Redis запросы выполняются только при `*_ACTIVE=true`.
|
||||||
@@ -12,6 +12,7 @@ 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
|
MongoClient = importlib.import_module("pymongo").MongoClient
|
||||||
|
Redis = importlib.import_module("redis").Redis
|
||||||
|
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
|
|
||||||
@@ -45,6 +46,12 @@ MONGO_URI = os.getenv("MONGO_URI", "mongodb://localhost:27017")
|
|||||||
MONGO_DB = os.getenv("MONGO_DB", "movie_data")
|
MONGO_DB = os.getenv("MONGO_DB", "movie_data")
|
||||||
MONGO_COLLECTION = os.getenv("MONGO_COLLECTION", "movies")
|
MONGO_COLLECTION = os.getenv("MONGO_COLLECTION", "movies")
|
||||||
|
|
||||||
|
REDIS_ACTIVE = os.getenv("REDIS_ACTIVE", "false").lower() == "true"
|
||||||
|
REDIS_HOST = os.getenv("REDIS_HOST", "localhost")
|
||||||
|
REDIS_PORT = int(os.getenv("REDIS_PORT", "6379"))
|
||||||
|
REDIS_DB = int(os.getenv("REDIS_DB", "0"))
|
||||||
|
REDIS_PASS = os.getenv("REDIS_PASS")
|
||||||
|
|
||||||
USER_SEED_DATA = [
|
USER_SEED_DATA = [
|
||||||
(1, "Ivan", 15),
|
(1, "Ivan", 15),
|
||||||
(2, "Igor", 22),
|
(2, "Igor", 22),
|
||||||
@@ -239,6 +246,46 @@ def select_mongo_movies(collection):
|
|||||||
return [document["title"] for document in cursor]
|
return [document["title"] for document in cursor]
|
||||||
|
|
||||||
|
|
||||||
|
def connect_redis():
|
||||||
|
return Redis(
|
||||||
|
host=REDIS_HOST,
|
||||||
|
port=REDIS_PORT,
|
||||||
|
db=REDIS_DB,
|
||||||
|
password=REDIS_PASS if REDIS_PASS else None,
|
||||||
|
decode_responses=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def insert_redis_movies(client):
|
||||||
|
if client.exists("movies:seeded"):
|
||||||
|
print("Redis data is already seeded.")
|
||||||
|
return
|
||||||
|
|
||||||
|
seed_movies = {
|
||||||
|
"Apollo 13": 1995,
|
||||||
|
"The Matrix": 1999,
|
||||||
|
"City of Angels": 1998,
|
||||||
|
"Toy Story": 1995,
|
||||||
|
"Alien": 1979,
|
||||||
|
}
|
||||||
|
for title, released in seed_movies.items():
|
||||||
|
client.hset(f"movie:{title}", mapping={"title": title, "released": released})
|
||||||
|
client.set("movies:seeded", "1")
|
||||||
|
print("Redis movies inserted.")
|
||||||
|
|
||||||
|
|
||||||
|
def select_redis_movies(client):
|
||||||
|
titles = []
|
||||||
|
for key in client.scan_iter(match="movie:*"):
|
||||||
|
movie = client.hgetall(key)
|
||||||
|
if not movie:
|
||||||
|
continue
|
||||||
|
released = int(movie.get("released", 0))
|
||||||
|
if 1990 <= released < 2000:
|
||||||
|
titles.append(movie.get("title", ""))
|
||||||
|
return sorted(title for title in titles if title)
|
||||||
|
|
||||||
|
|
||||||
def load_users():
|
def load_users():
|
||||||
admin_conn = connect_postgres("postgres")
|
admin_conn = connect_postgres("postgres")
|
||||||
try:
|
try:
|
||||||
@@ -428,4 +475,17 @@ if __name__ == "__main__":
|
|||||||
except Exception as error:
|
except Exception as error:
|
||||||
print(f"MongoDB load failed: {error}")
|
print(f"MongoDB load failed: {error}")
|
||||||
|
|
||||||
|
if REDIS_ACTIVE:
|
||||||
|
try:
|
||||||
|
redis_client = connect_redis()
|
||||||
|
insert_redis_movies(redis_client)
|
||||||
|
redis_movies = select_redis_movies(redis_client)
|
||||||
|
|
||||||
|
redis_window = DataWindow("redis", ["Info"], main_window, len(graph_windows))
|
||||||
|
redis_window.load_data([(title,) for title in redis_movies])
|
||||||
|
redis_window.show()
|
||||||
|
graph_windows.append(redis_window)
|
||||||
|
except Exception as error:
|
||||||
|
print(f"Redis load failed: {error}")
|
||||||
|
|
||||||
sys.exit(app.exec())
|
sys.exit(app.exec())
|
||||||
@@ -4,3 +4,4 @@ PyQt5
|
|||||||
python-dotenv
|
python-dotenv
|
||||||
influxdb3-python
|
influxdb3-python
|
||||||
pymongo
|
pymongo
|
||||||
|
redis
|
||||||
|
|||||||
Reference in New Issue
Block a user