Skip to content

Commit ef2b337

Browse files
Add Docker configuration and PostgreSQL integration
1 parent bf5c999 commit ef2b337

File tree

11 files changed

+150
-21
lines changed

11 files changed

+150
-21
lines changed

.env.dist

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
POSTGRES_USER=
2+
POSTGRES_PASSWORD=
3+
POSTGRES_DB=
4+
POSTGRES_HOST=
5+
POSTGRES_PORT=
6+
DATABASE_URL=

app/docker/Dockerfile

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
FROM postgres:16
2+
3+
WORKDIR /
4+
5+
ARG USE_POSTGIS=false
6+
7+
RUN apt-get update \
8+
&& apt-get install -f -y --no-install-recommends \
9+
ca-certificates \
10+
software-properties-common \
11+
build-essential \
12+
pkg-config \
13+
git \
14+
postgresql-server-dev-15 \
15+
&& add-apt-repository "deb http://ftp.debian.org/debian testing main contrib" \
16+
&& apt-get update

app/docker/tablas.sql

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
CREATE SCHEMA IF NOT EXISTS dev;
2+
3+
CREATE TABLE IF NOT EXISTS dev.users (
4+
id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL
5+
);
6+
7+
INSERT INTO
8+
dev.users (name)
9+
VALUES ('Agus'),
10+
('Pach'),
11+
('Sofi'),
12+
('Violeta');

app/main.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from controller.Users import UsersController
33
from service.Users import UsersService
44
from repository.Users import UsersRepository
5+
# from repository.UsersLocal import UsersRepository
56
from schemas.Schemas import CreateUserSchema
67

78

app/models/database.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from sqlalchemy.ext.declarative import declarative_base
2+
3+
Base = declarative_base()

app/models/users.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from sqlalchemy import Column, Integer, String
2+
from models.database import Base
3+
4+
5+
class User(Base):
6+
__tablename__ = "users"
7+
__table_args__ = {'schema': 'dev'}
8+
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
9+
name = Column(String, nullable=False)

app/repository/Users.py

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,47 @@
1-
from schemas.Schemas import UserSchema
1+
from sqlalchemy import create_engine, engine
2+
from sqlalchemy.orm import Session
3+
import os
4+
from models.users import User
25

36

47
class UsersRepository:
8+
db_url = engine.URL.create(
9+
"postgresql",
10+
database=os.environ["POSTGRES_DB"],
11+
username=os.environ["POSTGRES_USER"],
12+
password=os.environ["POSTGRES_PASSWORD"],
13+
host=os.environ["POSTGRES_HOST"],
14+
port=os.environ["POSTGRES_PORT"]
15+
)
16+
17+
engine = create_engine(db_url)
18+
519
def __init__(self):
6-
self.db = {}
7-
self._populate_default_users()
8-
9-
def _populate_default_users(self):
10-
default_users_data = [
11-
{"id": 1, "name": "John"},
12-
{"id": 2, "name": "Alice"},
13-
{"id": 3, "name": "Bob"},
14-
]
15-
for user_data in default_users_data:
16-
user = UserSchema(**user_data)
17-
self.db[user.id] = user
18-
19-
def get_user(self, user_id):
20-
return self.db.get(user_id)
20+
self.conn = self.engine.connect()
21+
self.session = Session(self.engine)
22+
23+
def shutdown(self):
24+
self.conn.close()
25+
self.session.close()
26+
27+
def rollback(self):
28+
self.session.rollback()
29+
30+
def get_user(self, user_id: int):
31+
user = self.session.query(User).filter_by(id=user_id).first()
32+
return user.__dict__
2133

2234
def get_all_users(self):
23-
return list(self.db.values())
35+
users = self.session.query(User).all()
36+
return self.__parse_result(users)
2437

2538
def create_user(self, name: str):
26-
new_user_id = max(self.db.keys()) + 1
27-
new_user = UserSchema(id=new_user_id, name=name)
28-
self.db[new_user_id] = new_user
29-
return new_user
39+
new_user = User(name=name)
40+
self.session.add(new_user)
41+
self.session.commit()
42+
return
43+
44+
def __parse_result(self, result):
45+
if not result:
46+
return []
47+
return [r.__dict__ for r in result]

app/repository/UsersLocal.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from schemas.Schemas import UserSchema
2+
3+
4+
class UsersRepository:
5+
def __init__(self):
6+
self.db = {}
7+
self._populate_default_users()
8+
9+
def _populate_default_users(self):
10+
default_users_data = [
11+
{"id": 1, "name": "John"},
12+
{"id": 2, "name": "Alice"},
13+
{"id": 3, "name": "Bob"},
14+
]
15+
for user_data in default_users_data:
16+
user = UserSchema(**user_data)
17+
self.db[user.id] = user
18+
19+
def get_user(self, user_id):
20+
return self.db.get(user_id)
21+
22+
def get_all_users(self):
23+
return list(self.db.values())
24+
25+
def create_user(self, name: str):
26+
new_user_id = max(self.db.keys()) + 1
27+
new_user = UserSchema(id=new_user_id, name=name)
28+
self.db[new_user_id] = new_user
29+
return new_user

app/service/Users.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from exceptions.UserException import UserNotFound
22
from repository.Users import UsersRepository
3+
# from repository.UsersLocal import UsersRepository
34

45

56
class UsersService:

docker-compose.yaml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,39 @@ services:
1010
- .env
1111
ports:
1212
- "8080:8080"
13+
depends_on:
14+
sql:
15+
condition: service_healthy
1316
volumes:
1417
- ./app:/app
1518
tty: true
19+
20+
sql:
21+
build:
22+
context: ./app/docker
23+
dockerfile: Dockerfile
24+
env_file:
25+
- .env
26+
ports:
27+
- "5432:5432"
28+
volumes:
29+
- ./app/docker:/docker-entrypoint-initdb.d
30+
healthcheck:
31+
test:
32+
[
33+
"CMD",
34+
"pg_isready",
35+
"-h",
36+
"localhost",
37+
"-p",
38+
"5432",
39+
"-q",
40+
"-U",
41+
"${POSTGRES_USER}",
42+
"-d",
43+
"${POSTGRES_DB}"
44+
]
45+
interval: 5s
46+
timeout: 3s
47+
retries: 10
48+
start_period: 50s

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ uvicorn
33
python-dotenv
44
flake8
55
psycopg2-binary
6+
SQLAlchemy

0 commit comments

Comments
 (0)