From 0eb06851150d98e03f8a0b4317f5420c439eb489 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Thu, 13 Mar 2025 15:04:24 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=85=D0=BE=D0=B4=20?= =?UTF-8?q?=D1=81=20SQLite3=20=D0=BD=D0=B0=20PostgreSQL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 4 ++++ README.md | 6 +++++- app/__init__.py | 10 ++++++++-- app/db.py | 28 ++++++++++++++++++++++------ env.example | 6 +++++- sql/table.sql | 12 ++++-------- 6 files changed, 48 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 468e872..85e0eb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +### 2.0.0 + +- переход с SQLite3 на PostgreSQL + ### 1.1.0 - Добавлен выхлом ошибок `try...catch` в логи diff --git a/README.md b/README.md index 89f76d1..6464480 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,11 @@ cp env.example .env - `APP_HASH` — Хэш приложения Telegram. - `ACCOUNT` — Имя аккаунта пользователя Telegram (_например `db_o_qp`_). - `LOG_PATH` — Путь в файлу логов (_например `/tmp/test.log`_). -- `DB_PATH` — Путь к файлу базы данных SQLite3 (_например `./db.sqlite`_). +- `DB_HOST` — Хост базы данных PostgreSQL +- `DB_PORT` — Порт сервера базы данных +- `DB_NAME` — Имя базы данных +- `DB_USER` — Имя пользователя +- `DB_PASSWORD` — Пароль пользователя ### 🐦‍🔥 Настройка виртуального окружения и загрузка бибилотек diff --git a/app/__init__.py b/app/__init__.py index 433ce6c..6662b81 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,6 +1,6 @@ # Информация о программе __author__ = 'Alexander Popov' -__version__ = (1, 1, 0) +__version__ = (2, 0, 0) # Импорт модулей стандартной библиотеки from os import getenv @@ -18,7 +18,13 @@ load_dotenv() # Выполняет чтение .env client = Client(getenv('ACCOUNT'), api_id=getenv('APP_ID'), api_hash=getenv('APP_HASH')) """Клиент Telegram""" -db = DataBase(getenv('DB_PATH')) +db = DataBase( + getenv('DB_HOST'), + int(getenv('DB_PORT')), + getenv('DB_NAME'), + getenv('DB_USER'), + getenv('DB_PASSWORD'), +) """База данных""" logger.add(getenv('LOG_PATH'), compression='zip') diff --git a/app/db.py b/app/db.py index 2a7c9c8..8d9bc24 100644 --- a/app/db.py +++ b/app/db.py @@ -1,19 +1,35 @@ # Импорт модулей стандартной библиотеки -import sqlite3 import json +# Импорт сторонних модулей +import psycopg2 + class DataBase(object): """Класс для работы с базой данных""" - def __init__(self, path): + def __init__(self, host: str, port: int, name: str, user: str, password: str): super(DataBase, self).__init__() - self.path = path - """Путь к файлу базы данных SQLite3""" + self.host = host + """Хост PostgreSQL базы данных""" + self.port = port + """Порт сервера базы данных""" + self.name = name + """Имя базы данных""" + self.user = user + """Имя пользователя""" + self.password = password + """Пароль пользователя""" def connect(self) -> bool: """Выполняет подключение к базе данных""" - self.conn = sqlite3.connect(self.path) + self.conn = psycopg2.connect( + dbname=self.name, + host=self.host, + user=self.user, + password=self.password, + port=self.port, + ) return True def close(self) -> bool: @@ -34,7 +50,7 @@ class DataBase(object): table = 'donates' cur = self.conn.cursor() - cur.execute('INSERT INTO {table} (\'data\') VALUES (\'{data}\')'.format(table=table, data=json.dumps(data))) + cur.execute('INSERT INTO {table} ("data") VALUES (\'{data}\')'.format(table=table, data=json.dumps(data))) self.commit() cur.close() diff --git a/env.example b/env.example index 38b1842..8cbaa4b 100644 --- a/env.example +++ b/env.example @@ -2,4 +2,8 @@ APP_ID="" APP_HASH="" ACCOUNT="" LOG_PATH="/tmp/test.log" -DB_PATH="./db.sqlite" +DB_HOST="" +DB_PORT="" +DB_NAME="" +DB_USER="" +DB_PASSWORD="" diff --git a/sql/table.sql b/sql/table.sql index 0a28a15..8e25950 100644 --- a/sql/table.sql +++ b/sql/table.sql @@ -1,12 +1,8 @@ BEGIN; -CREATE TABLE IF NOT EXISTS 'wins' -( - 'id' Integer PRIMARY KEY AUTOINCREMENT, - 'timestamp' DateTime NOT NULL DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')), - 'data' Text NOT NULL -); - -CREATE INDEX IF NOT EXISTS 'index_timestamp' ON 'wins' ('timestamp'); +CREATE TABLE "public"."wins" ( + "data" JSON NOT NULL, + "timestamp" Timestamp Without Time Zone DEFAULT CURRENT_TIMESTAMP ); + ; COMMIT;