FastAPI ile MongoDB üzerindeki Verileri Sunma

Emre Evcimen
3 min readJul 16, 2023

Merhabalar bu yazımda sizlere MongoDB de bulunan verilerimizi FastAPI yardımı ile sunma işlemini aktaracağım. İlk olarak yazı boyunca ele alacağımız sürecin mimarisine bakalım.

Yukarıda görmüş olduğunuz gibi aslında PostgreSQL’de bulunan verilerimizi Python dilini kullanarak MongoDB’ye aktarıyoruz daha sonrasında FastAPI ile MongoDB’de bulunan verilerimizi sunuyoruz. Postman yardımı ile de her şey istediğimiz gibi mi gerçekleşiyor onu kontrol edeceğiz.

İlk aşama olarak getdata_from_psql uzantılı kodumuza bakarak PostgreSQL’den verileri nasıl alıyoruz onu inceleyelim.

import logging
from sqlalchemy import create_engine, text
from sqlalchemy.exc import OperationalError
import configparser

parser = configparser.ConfigParser()
parser.read("conf.ini")


def connect_yemeksepetidb():
try:
database_url = f"postgresql://{parser.get('postgresql','username')}:{parser.get('postgresql','password')}@{parser.get('postgresql','hostname')}/yemeksepetidb"
engine = create_engine(database_url)
conn = engine.connect()
return conn
except OperationalError as err:
logging.error("Cannot connect to DB %s", err)

def execute_query():
conn = connect_yemeksepetidb()
table_name = "restaurant_comments"
comments = []
try:
query = conn.execute(text(f"select * from {table_name}"))
for data in query.fetchall():
comment = {
"comment_id": data[0],
"comment": data[1],
"restaurant_name": data[2]
}
comments.append(comment)
return comments

except OperationalError as err:
logging.error("Query failed &s", err)
# conf.ini
[postgresql]
hostname=xxxxxxxx
password=xxxxxxxx
username=xxxxxxxx
port=xxxxxxx
[mongodb]
hostname=xxxxxx
port=xxxxxx

PostgreSQL’de belirlediğimiz tablodan verilerin her birini dictionary yapı da alarak hepsini liste içeriside tutuyoruz ve execute_query fonksiyonunun çıktısı olarak bu listeyi döndürüyoruz.

Daha sonrasında ise write_data_to_mdb kodunun içerisinde de bu liste içerisindeki verileri MongoDB’ye basıyoruz. Aşağıda ilgili kodu paylaşıyorum.

from pymongo import MongoClient
from pymongo.errors import ConnectionFailure
from get_data_from_psql import execute_query
import logging
import configparser

parser = configparser.ConfigParser()
parser.read("conf.ini")

def mongodb_conn():
try:
logging.info("Attempting to connect...")
client = MongoClient(f'mongodb://{parser.get("mongodb","hostname")}:{parser.get("mongodb","port")}')
db = client['yemeksepetidb']
return db
except ConnectionFailure as e:
logging.error("ConnectionFailure seen: " + str(e))


def write_to_mongodb():
comments = execute_query()
db = mongodb_conn()
collection = db["restaurant_comments"]
for item in comments:
collection.insert_one(item)
logging.info("Item write to mongodb")

write_to_mongodb()

MongoDB Compass aracını kullanarak verilerimiz belirttiğimiz collection içerisine gelmiş mi kontrol edebiliriz.

Kontrol sağladığımız da başarılı şekilde verilerin geldiğini görebiliriz.

Son aşama olarak FastAPI kütüphanesini kullanarak MongoDB üzerindeki verilerimizi sunalım.

from pymongo import MongoClient
from fastapi import FastAPI
import configparser

parser = configparser.ConfigParser()
parser.read("conf.ini")

mongodb_uri = f"mongodb://{parser.get('mongodb','hostname')}:{parser.get('mongodb','port')}/"

app = FastAPI()


@app.get("/")
async def root():
return {"message": f"Welcome Comment API"}

@app.get("/restaurants")
async def get_distinct_restaurant():
with MongoClient(mongodb_uri) as client:
restaurant_collection = client["yemeksepetidb"]["restaurant_comments"]
distinct_restaurant_list = restaurant_collection.distinct("restaurant_name")
return distinct_restaurant_list


@app.get("/comments")
async def get_all_comments():
with MongoClient(mongodb_uri) as client:
comment_collection = client["yemeksepetidb"]["restaurant_comments"]
comment_response = comment_collection.find({},{"_id":0})
cmnt_list = []
for comment in comment_response:
cmnt_list.append(comment)
return cmnt_list

@app.get("/comment/{comment_id}")
async def get_comment_by_id(comment_id:int):
with MongoClient(mongodb_uri) as client:
comment_collection = client["yemeksepetidb"]["restaurant_comments"]
comment_response = comment_collection.find({"comment_id":comment_id},{"_id":0})
for comment in comment_response:
return comment

FastAPI servisini başlatmak için aşağıdaki kodu çalıştırabilirsiniz.

uvicorn making_a_rest_api:app --reload

Şimdi Postman aracını kullanarak test işlemlerimizi gerçekleştirelim.

http://localhost:8000

Test işlemlerimizi de başarılı şekilde gerçekleştirdik. Her şey istediğimiz gibi gözüküyor. 👏👌

Umarım sizler için faydalı bir yazı olmuştur. Bir sonraki yazıda görüşmek üzere 👋

--

--