Hello I have implemented a project that demonstrates tasks with Postgresql using Python(Flask), Docker, Kubernetes. But I am getting an error.
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not translate host name “db” to address: nodename nor servname provided, or not known
(Background on this error at: Error Messages — SQLAlchemy 2.0 Documentation)
services:
db:
image: postgres:latest
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: gorevler
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data/
app:
build: ../backend # Uygulamanızın Dockerfile'ının bulunduğu dizin
ports:
- "9000:5000" # Uygulamanızın portu (Flask varsayılan olarak 5000 kullanır)
environment:
DATABASE_URL: postgresql://postgres:password@db:5432/gorevler
DB_HOST: db
DB_PORT: 5432
DB_NAME: gorevler
DB_USER: postgres
DB_PASSWORD: password
depends_on:
- db
volumes:
postgres_data:
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Enum, ForeignKey
from enum import Enum as PyEnum
import os
import time
app = Flask(__name__)
db_host = os.environ.get('DB_HOST', 'localhost') # Varsayılan olarak 'localhost' kullan
db_port = os.environ.get('DB_PORT', '5432') # Varsayılan PostgreSQL portu
db_name = os.environ.get('DB_NAME', 'gorevler')
db_user = os.environ.get('DB_USER', 'postgres')
db_password = os.environ.get('DB_PASSWORD', 'password')
db_host = os.environ.get('DB_HOST', 'db')
# Veritabanı yapılandırması
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:password@db:5432/gorevler'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
# Veritabanı Modelleri
class GorevDurumu(PyEnum):
YENI = 'Yeni'
DEVAM_EDEN = 'Devam Ediyor'
TAMAMLANDI = 'Tamamlandı'
class GorevOnceligi(PyEnum):
DUSUK = 'Düşük'
ORTA = 'Orta'
YUKSEK = 'Yüksek'
class Gorev(db.Model):
id = db.Column(db.Integer, primary_key=True)
baslik = db.Column(db.String(255), nullable=False)
aciklama = db.Column(db.Text)
durum = db.Column(Enum(GorevDurumu), default=GorevDurumu.YENI)
oncelik = db.Column(Enum(GorevOnceligi), default=GorevOnceligi.ORTA)
kategori_id = db.Column(db.Integer, ForeignKey('kategori.id')) # kategori_id eklendi
# API Endpoint'leri
# Ana Sayfa - API Kontrolü için
@app.route('/', methods=['GET'])
def ana_sayfa():
return jsonify({"mesaj": "Görev Yönetimi API'si çalışıyor!"}), 200
# Görev oluştur
@app.route('/gorevler', methods=['POST'])
def gorev_olustur():
data = request.get_json()
yeni_gorev = Gorev(
baslik=data['baslik'],
aciklama=data.get('aciklama'),
durum=GorevDurumu(data.get('durum', 'YENI')),
oncelik=GorevOnceligi(data.get('oncelik', 'ORTA')),
kategori_id=data.get('kategori_id') # kategori_id eklendi
)
db.session.add(yeni_gorev)
db.session.commit()
return jsonify({'message': 'Görev oluşturuldu!', 'id': yeni_gorev.id}), 201
# Tüm görevleri listele
@app.route('/gorevler', methods=['GET'])
def gorevleri_listele():
gorevler = Gorev.query.all()
sonuc = [
{
'id': g.id,
'baslik': g.baslik,
'aciklama': g.aciklama,
'durum': g.durum.value,
'oncelik': g.oncelik.value,
'kategori_id': g.kategori_id # kategori_id eklendi
}
for g in gorevler
]
return jsonify(sonuc), 200
# Tek bir görevi getir
@app.route('/gorevler/<int:gorev_id>', methods=['GET'])
def gorev_getir(gorev_id):
gorev = Gorev.query.get(gorev_id)
if not gorev:
return jsonify({'error': 'Görev bulunamadı!'}), 404
sonuc = {
'id': gorev.id,
'baslik': gorev.baslik,
'aciklama': gorev.aciklama,
'durum': gorev.durum.value,
'oncelik': gorev.oncelik.value,
'kategori_id': gorev.kategori_id # kategori_id eklendi
}
return jsonify(sonuc), 200
# Görev güncelle
@app.route('/gorevler/<int:gorev_id>', methods=['PUT'])
def gorev_guncelle(gorev_id):
gorev = Gorev.query.get(gorev_id)
if not gorev:
return jsonify({'error': 'Görev bulunamadı!'}), 404
data = request.get_json()
gorev.baslik = data.get('baslik', gorev.baslik)
gorev.aciklama = data.get('aciklama', gorev.aciklama)
gorev.durum = GorevDurumu(data.get('durum', gorev.durum.value))
gorev.oncelik = GorevOnceligi(data.get('oncelik', gorev.oncelik.value))
gorev.kategori_id = data.get('kategori_id', gorev.kategori_id) # kategori_id güncellendi
db.session.commit()
return jsonify({'message': 'Görev güncellendi!'}), 200
# Görev sil
@app.route('/gorevler/<int:gorev_id>', methods=['DELETE'])
def gorev_sil(gorev_id):
gorev = Gorev.query.get(gorev_id)
if not gorev:
return jsonify({'error': 'Görev bulunamadı!'}), 404
db.session.delete(gorev)
db.session.commit()
return jsonify({'message': 'Görev silindi!'}), 200
# Veritabanı tablolarını oluştur ve uygulamayı çalıştır
if __name__ == '__main__':
with app.app_context():
time.sleep(10) # Veritabanının başlatılmasını beklemek için 10 saniye bekle
db.create_all()
app.run(debug=True, host='0.0.0.0')