{"id":37375,"date":"2026-01-01T21:41:03","date_gmt":"2026-01-01T18:41:03","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=37375"},"modified":"2026-01-01T21:41:03","modified_gmt":"2026-01-01T18:41:03","slug":"fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/","title":{"rendered":"FastAPI ve \u0130li\u015fkisel Veritaban\u0131 Kullan\u0131m\u0131 (Ubuntu \u00dczerinde)"},"content":{"rendered":"<p><body><\/p>\n<h2>FastAPI ve \u0130li\u015fkisel Veritaban\u0131 Kullan\u0131m\u0131 (Ubuntu \u00dczerinde)<\/h2>\n<p>Modern web uygulamalar\u0131 geli\u015ftirirken, h\u0131zl\u0131 ve etkili API&#8217;lar olu\u015fturmak kritik \u00f6neme sahiptir. Python ekosisteminde son y\u0131llarda pop\u00fclerli\u011fi h\u0131zla artan FastAPI, y\u00fcksek performansl\u0131, asenkron ve kullan\u0131m\u0131 kolay bir web \u00e7at\u0131s\u0131 olarak \u00f6ne \u00e7\u0131kmaktad\u0131r. \u0130li\u015fkisel veritabanlar\u0131 ise, veri tutarl\u0131l\u0131\u011f\u0131, yap\u0131sal b\u00fct\u00fcnl\u00fck ve g\u00fc\u00e7l\u00fc sorgu yetenekleri sayesinde bir\u00e7ok uygulaman\u0131n belkemi\u011fini olu\u015fturur. Bu makale, Ubuntu i\u015fletim sistemi \u00fczerinde FastAPI&#8217;yi bir ili\u015fkisel veritaban\u0131 (PostgreSQL \u00f6rne\u011fi \u00fczerinden) ile nas\u0131l entegre edece\u011finizi, SQLAlchemy ORM&#8217;i kullanarak veri modellerinizi nas\u0131l y\u00f6netece\u011finizi ve Pydantic ile veri do\u011frulamas\u0131n\u0131 nas\u0131l yapaca\u011f\u0131n\u0131z\u0131 ayr\u0131nt\u0131l\u0131 bir \u015fekilde ele alacakt\u0131r. Ayr\u0131ca, veritaban\u0131 \u015fema de\u011fi\u015fikliklerini y\u00f6netmek i\u00e7in Alembic migrasyon arac\u0131n\u0131 da inceleyece\u011fiz.<\/p>\n<p>Bu rehber, hem FastAPI&#8217;ye yeni ba\u015flayanlar hem de mevcut projelerinde ili\u015fkisel veritaban\u0131 entegrasyonu arayan deneyimli geli\u015ftiriciler i\u00e7in kapsaml\u0131 bir kaynak olmay\u0131 hedeflemektedir.<\/p>\n<h3>FastAPI ve \u0130li\u015fkisel Veritabanlar\u0131 Neden Birlikte Kullan\u0131lmal\u0131?<\/h3>\n<p>FastAPI, Python&#8217;\u0131n tip ipu\u00e7lar\u0131n\u0131 (type hints) kullanarak otomatik dok\u00fcmantasyon (OpenAPI\/Swagger UI), veri do\u011frulama ve serile\u015ftirme gibi \u00f6zellikleri kutudan \u00e7\u0131kt\u0131\u011f\u0131 gibi sunar. Starlette ve Pydantic \u00fczerine in\u015fa edilmi\u015f olmas\u0131 sayesinde hem performansl\u0131 hem de geli\u015ftirici dostudur. \u0130li\u015fkisel veritabanlar\u0131 ise, tablolar aras\u0131 ili\u015fkiler, ACID \u00f6zellikleri (Atomicity, Consistency, Isolation, Durability) ve g\u00fc\u00e7l\u00fc SQL sorgu yetenekleri ile karma\u015f\u0131k veri yap\u0131lar\u0131n\u0131 y\u00f6netmek i\u00e7in idealdir.<\/p>\n<p>FastAPI&#8217;nin asenkron yap\u0131s\u0131, veritaban\u0131 i\u015flemleri gibi I\/O yo\u011fun g\u00f6revleri beklerken di\u011fer i\u015flemleri y\u00fcr\u00fctmeye devam etmesini sa\u011flayarak uygulaman\u0131n genel yan\u0131t s\u00fcresini iyile\u015ftirir. SQLAlchemy gibi bir ORM (Object-Relational Mapper) kullanarak, SQL sorgular\u0131n\u0131 do\u011frudan yazmak yerine Python nesneleriyle \u00e7al\u0131\u015fabilir, bu da kodun daha okunabilir, s\u00fcrd\u00fcr\u00fclebilir ve hataya daha az yatk\u0131n olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Bu kombinasyon, geli\u015ftiricilere h\u0131zl\u0131 prototipleme, g\u00fc\u00e7l\u00fc veri y\u00f6netimi ve y\u00fcksek performansl\u0131 API&#8217;lar olu\u015fturma imkan\u0131 sunar.<\/p>\n<h3>\u00d6n Gereksinimler<\/h3>\n<p>Bu makaledeki ad\u0131mlar\u0131 takip edebilmek i\u00e7in a\u015fa\u011f\u0131daki \u00f6n gereksinimlere sahip olman\u0131z gerekmektedir:<\/p>\n<p>*   <strong>Ubuntu \u0130\u015fletim Sistemi:<\/strong> Tercihen 20.04 LTS veya daha yeni bir s\u00fcr\u00fcm.<br \/>\n*   <strong>Python 3.8+:<\/strong> Ubuntu genellikle Python 3 ile gelir, ancak en son s\u00fcr\u00fcm\u00fcn kurulu oldu\u011fundan emin olun.<br \/>\n*   <strong>pip:<\/strong> Python paket y\u00f6neticisi.<br \/>\n*   <strong>Temel Terminal Bilgisi:<\/strong> Komut sat\u0131r\u0131 i\u015flemlerine a\u015fina olmak.<br \/>\n*   <strong>Sanal Ortam Bilgisi (\u00d6nerilir):<\/strong> Proje ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 izole etmek i\u00e7in Python sanal ortamlar\u0131 kullanmak iyi bir pratiktir.<\/p>\n<h2>Ortam Kurulumu<\/h2>\n<p>Uygulamam\u0131z\u0131 geli\u015ftirmeye ba\u015flamadan \u00f6nce gerekli ara\u00e7lar\u0131 ve k\u00fct\u00fcphaneleri kurmam\u0131z gerekiyor. Bu b\u00f6l\u00fcmde, Python sanal ortam\u0131 olu\u015fturmaktan, FastAPI ve veritaban\u0131 s\u00fcr\u00fcc\u00fclerini kurmaya kadar t\u00fcm ad\u0131mlar\u0131 ele alaca\u011f\u0131z.<\/p>\n<h3>Python Sanal Ortam\u0131 Olu\u015fturma<\/h3>\n<p>Her Python projesi i\u00e7in ayr\u0131 bir sanal ortam kullanmak, ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nler ve projelerinizi d\u00fczenli tutar.<\/p>\n<p>\u0130lk olarak, projeniz i\u00e7in bir dizin olu\u015fturun ve i\u00e7ine girin:<\/p>\n<pre><code class=\"language-bash\">mkdir fastapidb_app\ncd fastapidb_app<\/code><\/pre>\n<p>\u015eimdi bir sanal ortam olu\u015ftural\u0131m ve etkinle\u015ftirelim:<\/p>\n<pre><code class=\"language-bash\">python3 -m venv venv\nsource venv\/bin\/activate<\/code><\/pre>\n<p>Sanal ortam etkinle\u015ftirildi\u011finde, terminal istemcinizin ba\u015f\u0131nda <code>(venv)<\/code> gibi bir ifade g\u00f6rmelisiniz.<\/p>\n<h3>Gerekli Python Paketlerini Kurma<\/h3>\n<p>\u015eimdi projemiz i\u00e7in gerekli olan Python paketlerini kural\u0131m:<\/p>\n<p>*   <strong>FastAPI:<\/strong> Web \u00e7at\u0131s\u0131.<br \/>\n*   <strong>Uvicorn:<\/strong> ASGI sunucusu, FastAPI uygulamas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <strong>SQLAlchemy:<\/strong> Python ORM (Object-Relational Mapper) k\u00fct\u00fcphanesi.<br \/>\n*   <strong>psycopg2-binary:<\/strong> PostgreSQL veritaban\u0131 s\u00fcr\u00fcc\u00fcs\u00fc. (E\u011fer MySQL kullanacaksan\u0131z <code>mysqlclient<\/code> veya <code>PyMySQL<\/code> kurmal\u0131s\u0131n\u0131z.)<br \/>\n*   <strong>Pydantic:<\/strong> Veri do\u011frulama ve ayarlar y\u00f6netimi i\u00e7in kullan\u0131l\u0131r (FastAPI&#8217;nin bir ba\u011f\u0131ml\u0131l\u0131\u011f\u0131d\u0131r ancak a\u00e7\u0131k\u00e7a belirtmek faydal\u0131 olabilir).<br \/>\n*   <strong>Alembic:<\/strong> Veritaban\u0131 migrasyon arac\u0131.<\/p>\n<pre><code class=\"language-bash\">pip install fastapi uvicorn sqlalchemy psycopg2-binary alembic pydantic<\/code><\/pre>\n<p>Bu komut, projenizin <code>venv<\/code> ortam\u0131na gerekli t\u00fcm k\u00fct\u00fcphaneleri y\u00fckleyecektir.<\/p>\n<h2>Veritaban\u0131 Kurulumu (PostgreSQL \u00d6rne\u011fi)<\/h2>\n<p>Uygulamam\u0131z\u0131n veri depolama katman\u0131 olarak PostgreSQL&#8217;i kullanaca\u011f\u0131z. Ubuntu \u00fczerinde PostgreSQL&#8217;i kurmak ve yap\u0131land\u0131rmak olduk\u00e7a basittir.<\/p>\n<h3>PostgreSQL Kurulumu<\/h3>\n<p>Ubuntu sisteminizde PostgreSQL&#8217;i kurmak i\u00e7in a\u015fa\u011f\u0131daki komutlar\u0131 kullan\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt install postgresql postgresql-contrib<\/code><\/pre>\n<p>Kurulum tamamland\u0131ktan sonra PostgreSQL servisi otomatik olarak ba\u015flayacakt\u0131r. Servisin durumunu kontrol etmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">systemctl status postgresql<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131da <code>active (exited)<\/code> veya <code>active (running)<\/code> gibi bir durum g\u00f6rmelisiniz.<\/p>\n<h3>Veritaban\u0131 Kullan\u0131c\u0131s\u0131 ve Veritaban\u0131 Olu\u015fturma<\/h3>\n<p>G\u00fcvenlik ve izolasyon i\u00e7in, uygulaman\u0131z i\u00e7in \u00f6zel bir veritaban\u0131 ve bir kullan\u0131c\u0131 olu\u015fturmak iyi bir pratiktir. PostgreSQL, <code>postgres<\/code> ad\u0131nda varsay\u0131lan bir y\u00f6netici kullan\u0131c\u0131s\u0131yla gelir. Bu kullan\u0131c\u0131ya ge\u00e7i\u015f yaparak yeni veritaban\u0131m\u0131z\u0131 ve kullan\u0131c\u0131m\u0131z\u0131 olu\u015fturaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-bash\">sudo -i -u postgres<\/code><\/pre>\n<p>\u015eimdi PostgreSQL komut istemcisine girelim:<\/p>\n<pre><code class=\"language-bash\">psql<\/code><\/pre>\n<p>PostgreSQL istemcisindeyken, yeni bir veritaban\u0131 ve kullan\u0131c\u0131 olu\u015ftural\u0131m. Kendi g\u00fcvenli parolan\u0131z\u0131 kullanmay\u0131 unutmay\u0131n!<\/p>\n<pre><code class=\"language-sql\">CREATE DATABASE fastapidb;\nCREATE USER fastapiuser WITH PASSWORD 'your_strong_password';\nGRANT ALL PRIVILEGES ON DATABASE fastapidb TO fastapiuser;<\/code><\/pre>\n<p>\u0130\u015flemler tamamland\u0131\u011f\u0131nda <code>\\q<\/code> yazarak <code>psql<\/code> istemcisinden \u00e7\u0131k\u0131n ve ard\u0131ndan <code>exit<\/code> yazarak <code>postgres<\/code> kullan\u0131c\u0131s\u0131ndan kendi kullan\u0131c\u0131n\u0131za geri d\u00f6n\u00fcn.<\/p>\n<pre><code class=\"language-bash\">\\q\nexit<\/code><\/pre>\n<p>Art\u0131k <code>fastapidb<\/code> ad\u0131nda bir veritaban\u0131m\u0131z ve <code>fastapiuser<\/code> ad\u0131nda bu veritaban\u0131na tam yetkili bir kullan\u0131c\u0131m\u0131z var.<\/p>\n<h2>FastAPI Uygulama Yap\u0131s\u0131 ve Temel Bile\u015fenler<\/h2>\n<p>Bir FastAPI uygulamas\u0131n\u0131 geli\u015ftirirken, kodu mod\u00fcler ve y\u00f6netilebilir tutmak i\u00e7in belirli bir dosya yap\u0131s\u0131 izlemek faydal\u0131d\u0131r. \u0130\u015fte \u00f6nerilen yap\u0131:<\/p>\n<h3>Proje Dizini Olu\u015fturma<\/h3>\n<p>Daha \u00f6nce olu\u015fturdu\u011fumuz <code>fastapidb_app<\/code> dizininin i\u00e7inde oldu\u011funuzdan emin olun. E\u011fer de\u011filseniz:<\/p>\n<pre><code class=\"language-bash\">cd fastapidb_app<\/code><\/pre>\n<h3>Dosya Yap\u0131s\u0131<\/h3>\n<p>Projemiz i\u00e7in a\u015fa\u011f\u0131daki dosya yap\u0131s\u0131n\u0131 kullanaca\u011f\u0131z:<\/p>\n<pre><code class=\"language-\">fastapidb_app\/\n\u251c\u2500\u2500 venv\/\n\u251c\u2500\u2500 alembic\/\n\u251c\u2500\u2500 alembic.ini\n\u251c\u2500\u2500 main.py\n\u251c\u2500\u2500 database.py\n\u251c\u2500\u2500 models.py\n\u251c\u2500\u2500 schemas.py\n\u251c\u2500\u2500 crud.py\n\u251c\u2500\u2500 requirements.txt<\/code><\/pre>\n<p>*   <strong><code>main.py<\/code><\/strong>: FastAPI uygulamas\u0131n\u0131n ana giri\u015f noktas\u0131. API rotalar\u0131n\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 tan\u0131mlar.<br \/>\n*   <strong><code>database.py<\/code><\/strong>: Veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131, oturum y\u00f6netimini ve SQLAlchemy <code>Base<\/code> s\u0131n\u0131f\u0131n\u0131 i\u00e7erir.<br \/>\n*   <strong><code>models.py<\/code><\/strong>: SQLAlchemy ORM modellerini tan\u0131mlar. Veritaban\u0131 tablolar\u0131n\u0131n Python kar\u015f\u0131l\u0131klar\u0131d\u0131r.<br \/>\n*   <strong><code>schemas.py<\/code><\/strong>: Pydantic modellerini tan\u0131mlar. API istek ve yan\u0131tlar\u0131n\u0131n veri yap\u0131lar\u0131n\u0131 do\u011frular ve serile\u015ftirir.<br \/>\n*   <strong><code>crud.py<\/code><\/strong>: Veritaban\u0131 CRUD (Create, Read, Update, Delete) i\u015flemlerini ger\u00e7ekle\u015ftiren fonksiyonlar\u0131 i\u00e7erir. Bu, i\u015f mant\u0131\u011f\u0131n\u0131 API rotalar\u0131ndan ay\u0131r\u0131r.<br \/>\n*   <strong><code>alembic\/<\/code><\/strong>: Alembic migrasyon dosyalar\u0131n\u0131 bar\u0131nd\u0131ran dizin.<br \/>\n*   <strong><code>alembic.ini<\/code><\/strong>: Alembic yap\u0131land\u0131rma dosyas\u0131.<br \/>\n*   <strong><code>requirements.txt<\/code><\/strong>: Proje ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 listeler (iste\u011fe ba\u011fl\u0131, ancak iyi bir pratiktir).<\/p>\n<p>\u015eimdi bu dosyalar\u0131n i\u00e7eriklerini tek tek olu\u015ftural\u0131m.<\/p>\n<h2>SQLAlchemy ile Veritaban\u0131 Ba\u011flant\u0131s\u0131 ve Modeller<\/h2>\n<p>SQLAlchemy, Python&#8217;da ili\u015fkisel veritabanlar\u0131yla \u00e7al\u0131\u015fmak i\u00e7in kullan\u0131lan g\u00fc\u00e7l\u00fc bir ORM ve SQL ara\u00e7 tak\u0131m\u0131d\u0131r. Veritaban\u0131 tablolar\u0131n\u0131z\u0131 Python s\u0131n\u0131flar\u0131 olarak tan\u0131mlaman\u0131za olanak tan\u0131r.<\/p>\n<h3>Veritaban\u0131 Ba\u011flant\u0131 Ayarlar\u0131 (<code>database.py<\/code>)<\/h3>\n<p>Bu dosya, veritaban\u0131 ba\u011flant\u0131 bilgilerini ve SQLAlchemy&#8217;nin veritaban\u0131yla etkile\u015fim kurmas\u0131n\u0131 sa\u011flayacak temel yap\u0131land\u0131rmay\u0131 i\u00e7erir.<\/p>\n<pre><code class=\"language-python\"># fastapidb_app\/database.py\n\nfrom sqlalchemy import create_engine\nfrom sqlalchemy.ext.declarative import declarative_base\nfrom sqlalchemy.orm import sessionmaker\nimport os\n\n<h2>Ortam de\u011fi\u015fkenlerinden veritaban\u0131 URL'sini al, yoksa varsay\u0131lan\u0131 kullan<\/h2>\n<h2>G\u00fcvenlik i\u00e7in ger\u00e7ek uygulamalarda bu t\u00fcr bilgileri do\u011frudan koda yazmaktan ka\u00e7\u0131n\u0131n.<\/h2>\n<h2>.env dosyas\u0131 veya benzeri bir y\u00f6ntemle y\u00f6netilmelidir.<\/h2>\nSQLALCHEMY_DATABASE_URL = os.getenv(\"DATABASE_URL\", \"postgresql:\/\/fastapiuser:your_strong_password@localhost\/fastapidb\")\n\n<h2>SQLAlchemy motorunu olu\u015ftur.<\/h2>\n<h2>connect_args={\"check_same_thread\": False} SQLite i\u00e7in gereklidir, PostgreSQL i\u00e7in de\u011fil.<\/h2>\n<h2>Ancak asenkron veritaban\u0131 s\u00fcr\u00fcc\u00fcleri kullan\u0131ld\u0131\u011f\u0131nda farkl\u0131 yakla\u015f\u0131mlar gerekebilir.<\/h2>\nengine = create_engine(\n    SQLALCHEMY_DATABASE_URL\n)\n\n<h2>Her bir veritaban\u0131 oturumu i\u00e7in bir SessionLocal s\u0131n\u0131f\u0131 olu\u015ftur.<\/h2>\n<h2>Bu s\u0131n\u0131f\u0131n \u00f6rnekleri, veritaban\u0131 i\u015flemleri i\u00e7in kullan\u0131lacak.<\/h2>\nSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)\n\n<h2>Veritaban\u0131 modellerimiz i\u00e7in temel s\u0131n\u0131f\u0131 olu\u015ftur.<\/h2>\n<h2>Bu s\u0131n\u0131f, t\u00fcm SQLAlchemy ORM modellerimizin miras alaca\u011f\u0131 temel s\u0131n\u0131ft\u0131r.<\/h2>\nBase = declarative_base()\n\n<h2>FastAPI ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu i\u00e7in veritaban\u0131 oturumu sa\u011flayan bir yard\u0131mc\u0131 fonksiyon.<\/h2>\ndef get_db():\n    db = SessionLocal()\n    try:\n        yield db\n    finally:\n        db.close()<\/code><\/pre>\n<p><strong>A\u00e7\u0131klamalar:<\/strong><\/p>\n<p>*   <code>SQLALCHEMY_DATABASE_URL<\/code>: Veritaban\u0131 ba\u011flant\u0131 dizesi. <code>postgresql:\/\/kullanici:parola@host:port\/veritabani_adi<\/code> format\u0131ndad\u0131r. G\u00fcvenlik nedeniyle parolan\u0131z\u0131 do\u011frudan koda yazmak yerine ortam de\u011fi\u015fkenlerinden alman\u0131z\u0131 \u00f6neririz.<br \/>\n*   <code>create_engine<\/code>: SQLAlchemy&#8217;nin veritaban\u0131na ba\u011flanmak i\u00e7in kulland\u0131\u011f\u0131 motoru olu\u015fturur.<br \/>\n*   <code>sessionmaker<\/code>: Her istek i\u00e7in bir veritaban\u0131 oturumu (session) olu\u015fturmak i\u00e7in kullan\u0131l\u0131r. <code>autocommit=False<\/code> ve <code>autoflush=False<\/code> ayarlar\u0131, i\u015flemleri manuel olarak y\u00f6netmemizi sa\u011flar.<br \/>\n*   <code>declarative_base()<\/code>: SQLAlchemy ORM modellerimizin miras alaca\u011f\u0131 temel s\u0131n\u0131f\u0131 olu\u015fturur.<br \/>\n*   <code>get_db()<\/code>: FastAPI&#8217;nin ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu sistemiyle uyumlu, bir veritaban\u0131 oturumu sa\u011flayan bir jenerat\u00f6r fonksiyonudur. Her istek ba\u015flad\u0131\u011f\u0131nda bir oturum a\u00e7ar ve istek tamamland\u0131\u011f\u0131nda oturumu kapat\u0131r.<\/p>\n<h3>Veritaban\u0131 Modelleri (<code>models.py<\/code>)<\/h3>\n<p>Bu dosya, veritaban\u0131 tablolar\u0131m\u0131z\u0131 temsil eden SQLAlchemy ORM modellerini i\u00e7erir.<\/p>\n<pre><code class=\"language-python\"># fastapidb_app\/models.py\n\nfrom sqlalchemy import Boolean, Column, Integer, String\nfrom sqlalchemy.orm import relationship\n\nfrom .database import Base\n\nclass User(Base):\n    __tablename__ = \"users\" # Veritaban\u0131ndaki tablo ad\u0131\n\n    id = Column(Integer, primary_key=True, index=True) # Birincil anahtar, otomatik artan\n    email = Column(String, unique=True, index=True) # E-posta, benzersiz ve indeksli\n    hashed_password = Column(String) # \u015eifrenin hash'lenmi\u015f hali\n    is_active = Column(Boolean, default=True) # Kullan\u0131c\u0131n\u0131n aktif olup olmad\u0131\u011f\u0131n\u0131 belirtir\n\n    # \u0130li\u015fkili modeller buraya eklenebilir (\u00f6rne\u011fin, bir kullan\u0131c\u0131n\u0131n birden fazla \u00f6\u011fesi olabilir)\n    # items = relationship(\"Item\", back_populates=\"owner\")\n\n<h2>\u00d6rnek olarak bir Item modeli de ekleyebiliriz (iste\u011fe ba\u011fl\u0131)<\/h2>\n<h2>class Item(Base):<\/h2>\n<h2>__tablename__ = \"items\"<\/h2>\n<h2>#     id = Column(Integer, primary_key=True, index=True)<\/h2>\n<h2>title = Column(String, index=True)<\/h2>\n<h2>description = Column(String, index=True)<\/h2>\n<h2>owner_id = Column(Integer, ForeignKey(\"users.id\"))<\/h2>\n<h2>#     owner = relationship(\"User\", back_populates=\"items\")<\/code><\/pre>\n<\/h2>\n<p><strong>A\u00e7\u0131klamalar:<\/strong><\/p>\n<p>*   <code>Base<\/code>: <code>database.py<\/code> dosyas\u0131ndan i\u00e7e aktard\u0131\u011f\u0131m\u0131z temel s\u0131n\u0131ft\u0131r. T\u00fcm ORM modellerimiz bu s\u0131n\u0131ftan miras almal\u0131d\u0131r.<br \/>\n*   <code>__tablename__<\/code>: Bu s\u0131n\u0131f\u0131n veritaban\u0131nda hangi tabloyu temsil etti\u011fini belirtir.<br \/>\n*   <code>Column<\/code>: Tablo s\u00fctunlar\u0131n\u0131 tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <code>Integer<\/code>, <code>String<\/code>, <code>Boolean<\/code>: SQLAlchemy&#8217;nin veri tipleri.<br \/>\n*   <code>primary_key=True<\/code>: Bu s\u00fctunun birincil anahtar oldu\u011funu belirtir.<br \/>\n*   <code>index=True<\/code>: Bu s\u00fctun \u00fczerinde bir veritaban\u0131 indeksi olu\u015fturur, bu da sorgu performans\u0131n\u0131 art\u0131rabilir.<br \/>\n*   <code>unique=True<\/code>: Bu s\u00fctundaki de\u011ferlerin benzersiz olmas\u0131 gerekti\u011fini belirtir.<br \/>\n*   <code>relationship<\/code>: \u0130li\u015fkili modeller aras\u0131nda ba\u011flant\u0131 kurmak i\u00e7in kullan\u0131l\u0131r (\u00f6rne\u011fin, bir kullan\u0131c\u0131n\u0131n bir\u00e7ok \u00f6\u011fesi olabilir).<\/p>\n<h2>Pydantic ile Veri \u015eemalar\u0131<\/h2>\n<p>Pydantic, Python&#8217;da veri do\u011frulama ve ayarlar y\u00f6netimi i\u00e7in kullan\u0131lan bir k\u00fct\u00fcphanedir. FastAPI, Pydantic&#8217;i API isteklerinin g\u00f6vdelerini do\u011frulamak, yan\u0131tlar\u0131 serile\u015ftirmek ve otomatik OpenAPI dok\u00fcmantasyonu olu\u015fturmak i\u00e7in yo\u011fun bir \u015fekilde kullan\u0131r.<\/p>\n<h3>Giri\u015f ve \u00c7\u0131k\u0131\u015f Veri Modelleri (<code>schemas.py<\/code>)<\/h3>\n<p>API&#8217;miz i\u00e7in Pydantic modellerini tan\u0131mlayaca\u011f\u0131z. Genellikle, kullan\u0131c\u0131dan al\u0131nan veriler (giri\u015f \u015femalar\u0131) ve kullan\u0131c\u0131ya geri g\u00f6nderilen veriler (\u00e7\u0131k\u0131\u015f \u015femalar\u0131) i\u00e7in farkl\u0131 modeller tan\u0131mlamak iyi bir pratiktir.<\/p>\n<pre><code class=\"language-python\"># fastapidb_app\/schemas.py\n\nfrom pydantic import BaseModel, EmailStr\nfrom typing import List, Optional\n\n<h2>Temel kullan\u0131c\u0131 \u015femas\u0131 - e-posta ve aktiflik durumu<\/h2>\nclass UserBase(BaseModel):\n    email: EmailStr # E-posta format\u0131nda olmal\u0131\n    is_active: Optional[bool] = True # \u0130ste\u011fe ba\u011fl\u0131, varsay\u0131lan True\n\n<h2>Kullan\u0131c\u0131 olu\u015fturma \u015femas\u0131 - UserBase'e ek olarak parola i\u00e7erir<\/h2>\nclass UserCreate(UserBase):\n    password: str\n\n<h2>Kullan\u0131c\u0131 g\u00fcncelleme \u015femas\u0131 (iste\u011fe ba\u011fl\u0131 alanlar)<\/h2>\nclass UserUpdate(UserBase):\n    password: Optional[str] = None\n\n<h2>API yan\u0131t\u0131 i\u00e7in kullan\u0131c\u0131 \u015femas\u0131 - hassas bilgileri (parola) i\u00e7ermez<\/h2>\nclass User(UserBase):\n    id: int # Veritaban\u0131ndan gelen id\n    # items: List[Item] = [] # \u0130li\u015fkili \u00f6\u011feler varsa eklenebilir\n\n    class Config:\n        orm_mode = True # SQLAlchemy ORM modelleriyle uyumlu \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar (eski ad\u0131yla <code>orm_mode = True<\/code>)\n        # FastAPI 0.100.0 ve sonras\u0131 i\u00e7in <code>from_attributes = True<\/code> kullan\u0131lmas\u0131 \u00f6nerilir.\n        # E\u011fer FastAPI s\u00fcr\u00fcm\u00fcn\u00fcz yeniyse, a\u015fa\u011f\u0131daki gibi de\u011fi\u015ftirin:\n        # from_attributes = True\n\n<h2>\u00d6rnek olarak Item \u015femalar\u0131 (iste\u011fe ba\u011fl\u0131)<\/h2>\n<h2>class ItemBase(BaseModel):<\/h2>\n<h2>title: str<\/h2>\n<h2>description: Optional[str] = None<\/h2>\n<h2># class ItemCreate(ItemBase):<\/h2>\n<h2>pass<\/h2>\n<h2># class Item(ItemBase):<\/h2>\n<h2>id: int<\/h2>\n<h2>owner_id: int<\/h2>\n<h2>#     class Config:<\/h2>\n<h2>orm_mode = True<\/h2>\n<h2># from_attributes = True<\/code><\/pre>\n<\/h2>\n<p><strong>A\u00e7\u0131klamalar:<\/strong><\/p>\n<p>*   <code>BaseModel<\/code>: T\u00fcm Pydantic modellerinin miras alaca\u011f\u0131 temel s\u0131n\u0131ft\u0131r.<br \/>\n*   <code>EmailStr<\/code>: Pydantic&#8217;in e-posta format\u0131n\u0131 do\u011frulayan \u00f6zel bir tipi.<br \/>\n*   <code>Optional<\/code>: Bir alan\u0131n iste\u011fe ba\u011fl\u0131 oldu\u011funu belirtir.<br \/>\n*   <code>UserCreate<\/code>: Kullan\u0131c\u0131 olu\u015ftururken <code>password<\/code> alan\u0131n\u0131n da zorunlu olmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <code>User<\/code>: API&#8217;den yan\u0131t olarak d\u00f6necek kullan\u0131c\u0131 verisinin yap\u0131s\u0131n\u0131 tan\u0131mlar. <code>hashed_password<\/code> gibi hassas alanlar\u0131 i\u00e7ermez.<br \/>\n*   <code>Config.orm_mode = True<\/code> (veya <code>from_attributes = True<\/code>): Bu ayar, Pydantic modelinin SQLAlchemy ORM modelinden do\u011frudan veri okuyabilmesini sa\u011flar. Yani, bir <code>User<\/code> ORM nesnesini do\u011frudan bir <code>User<\/code> Pydantic modeline d\u00f6n\u00fc\u015ft\u00fcrebiliriz.<\/p>\n<h2>CRUD \u0130\u015flemleri<\/h2>\n<p>CRUD (Create, Read, Update, Delete) i\u015flemleri, bir veritaban\u0131yla yap\u0131lan temel etkile\u015fimlerdir. Bu i\u015flemleri ayr\u0131 bir mod\u00fclde tan\u0131mlamak, kodunuzu daha d\u00fczenli ve test edilebilir hale getirir.<\/p>\n<h3>Veritaban\u0131 Etkile\u015fim Fonksiyonlar\u0131 (<code>crud.py<\/code>)<\/h3>\n<p>Bu dosya, veritaban\u0131 oturumunu kullanarak kullan\u0131c\u0131lar\u0131 olu\u015fturma, okuma, g\u00fcncelleme ve silme gibi i\u015flevleri sa\u011flar.<\/p>\n<pre><code class=\"language-python\"># fastapidb_app\/crud.py\n\nfrom sqlalchemy.orm import Session\nfrom sqlalchemy import func # func'\u0131 import etmeyi unutmay\u0131n\n\nfrom . import models, schemas\nfrom passlib.context import CryptContext # \u015eifre hash'leme i\u00e7in\n\n<h2>\u015eifre hash'leme ba\u011flam\u0131n\u0131 olu\u015ftur<\/h2>\npwd_context = CryptContext(schemes=[\"bcrypt\"], deprecated=\"auto\")\n\n<h2>\u015eifreyi hash'leyen yard\u0131mc\u0131 fonksiyon<\/h2>\ndef get_password_hash(password: str):\n    return pwd_context.hash(password)\n\n<h2>\u015eifreyi do\u011frulayan yard\u0131mc\u0131 fonksiyon<\/h2>\ndef verify_password(plain_password: str, hashed_password: str):\n    return pwd_context.verify(plain_password, hashed_password)\n\n<h2>Kullan\u0131c\u0131y\u0131 ID'ye g\u00f6re getir<\/h2>\ndef get_user(db: Session, user_id: int):\n    return db.query(models.User).filter(models.User.id == user_id).first()\n\n<h2>Kullan\u0131c\u0131y\u0131 e-postaya g\u00f6re getir<\/h2>\ndef get_user_by_email(db: Session, email: str):\n    return db.query(models.User).filter(models.User.email == email).first()\n\n<h2>T\u00fcm kullan\u0131c\u0131lar\u0131 getir (belirli bir atlama ve limit ile sayfalama i\u00e7in)<\/h2>\ndef get_users(db: Session, skip: int = 0, limit: int = 100):\n    return db.query(models.User).offset(skip).limit(limit).all()\n\n<h2>Yeni bir kullan\u0131c\u0131 olu\u015ftur<\/h2>\ndef create_user(db: Session, user: schemas.UserCreate):\n    hashed_password = get_password_hash(user.password)\n    db_user = models.User(email=user.email, hashed_password=hashed_password, is_active=user.is_active)\n    db.add(db_user)\n    db.commit() # De\u011fi\u015fiklikleri veritaban\u0131na kaydet\n    db.refresh(db_user) # Veritaban\u0131ndan g\u00fcncel verileri (\u00f6rn. id) al\n    return db_user\n\n<h2>Kullan\u0131c\u0131y\u0131 g\u00fcncelle<\/h2>\ndef update_user(db: Session, user_id: int, user_update: schemas.UserUpdate):\n    db_user = db.query(models.User).filter(models.User.id == user_id).first()\n    if db_user:\n        # Pydantic modelinden gelen alanlar\u0131 SQLAlchemy modeline uygula\n        update_data = user_update.dict(exclude_unset=True) # Sadece ayarlanm\u0131\u015f alanlar\u0131 al\n\n        if \"password\" in update_data and update_data[\"password\"]:\n            db_user.hashed_password = get_password_hash(update_data[\"password\"])\n            del update_data[\"password\"] # Parola zaten i\u015flendi, di\u011fer g\u00fcncellemelere dahil etme\n\n        for key, value in update_data.items():\n            setattr(db_user, key, value)\n\n        db.add(db_user)\n        db.commit()\n        db.refresh(db_user)\n    return db_user\n\n<h2>Kullan\u0131c\u0131y\u0131 sil<\/h2>\ndef delete_user(db: Session, user_id: int):\n    db_user = db.query(models.User).filter(models.User.id == user_id).first()\n    if db_user:\n        db.delete(db_user)\n        db.commit()\n        return True\n    return False\n\n<h2>Toplam kullan\u0131c\u0131 say\u0131s\u0131n\u0131 d\u00f6nd\u00fcr<\/h2>\ndef get_users_count(db: Session):\n    return db.query(func.count(models.User.id)).scalar()<\/code><\/pre>\n<p><strong>A\u00e7\u0131klamalar:<\/strong><\/p>\n<p>*   <code>Session<\/code>: <code>database.py<\/code> dosyas\u0131ndan gelen veritaban\u0131 oturumu tipidir. FastAPI ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu ile sa\u011flanacakt\u0131r.<br \/>\n*   <code>pwd_context<\/code>: <code>passlib<\/code> k\u00fct\u00fcphanesinden \u015fifre hash&#8217;leme ve do\u011frulama i\u00e7in kullan\u0131l\u0131r. \u015eifreleri do\u011frudan veritaban\u0131nda saklamak yerine hash&#8217;leyerek saklamak zorunludur.<br \/>\n*   <code>db.query(models.User)<\/code>: <code>User<\/code> modeline kar\u015f\u0131l\u0131k gelen tablo \u00fczerinde bir sorgu ba\u015flat\u0131r.<br \/>\n*   <code>filter()<\/code>, <code>first()<\/code>, <code>all()<\/code>: Sorgu sonu\u00e7lar\u0131n\u0131 filtrelemek ve almak i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <code>db.add()<\/code>, <code>db.commit()<\/code>, <code>db.refresh()<\/code>: Veritaban\u0131na yeni bir nesne eklemek, de\u011fi\u015fiklikleri kaydetmek ve eklenen nesnenin veritaban\u0131 taraf\u0131ndan olu\u015fturulan <code>id<\/code> gibi alanlar\u0131n\u0131 g\u00fcncellemek i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <code>db.delete()<\/code>: Bir nesneyi veritaban\u0131ndan siler.<br \/>\n*   <code>update_user<\/code> fonksiyonunda <code>user_update.dict(exclude_unset=True)<\/code> kullanarak sadece Pydantic modelinde belirtilen ve de\u011feri de\u011fi\u015ftirilen alanlar\u0131 g\u00fcncelleriz.<\/p>\n<h2>FastAPI Y\u00f6nlendiricileri ve Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu<\/h2>\n<p>FastAPI, API u\u00e7 noktalar\u0131n\u0131 (rotalar\u0131) tan\u0131mlamak i\u00e7in dekorat\u00f6rler kullan\u0131r ve ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu (Dependency Injection) ile veritaban\u0131 oturumlar\u0131 gibi kaynaklar\u0131 kolayca y\u00f6netmenizi sa\u011flar.<\/p>\n<h3>API U\u00e7 Noktalar\u0131 (<code>main.py<\/code>)<\/h3>\n<p>Bu dosya, FastAPI uygulaman\u0131z\u0131n ana giri\u015f noktas\u0131d\u0131r ve API rotalar\u0131n\u0131 tan\u0131mlar.<\/p>\n<pre><code class=\"language-python\"># fastapidb_app\/main.py\n\nfrom typing import List\nfrom fastapi import FastAPI, Depends, HTTPException, status\nfrom sqlalchemy.orm import Session\n\nfrom . import crud, models, schemas\nfrom .database import SessionLocal, engine, get_db\n\n<h2>Veritaban\u0131 tablolar\u0131n\u0131 olu\u015ftur (Alembic kullan\u0131yorsak bu sat\u0131ra gerek kalmaz)<\/h2>\n<h2>models.Base.metadata.create_all(bind=engine)<\/h2>\n\napp = FastAPI(\n    title=\"FastAPI Kullan\u0131c\u0131 Y\u00f6netimi\",\n    description=\"SQLAlchemy ve PostgreSQL ile temel kullan\u0131c\u0131 CRUD i\u015flemleri.\",\n    version=\"1.0.0\",\n)\n\n<h2>Root endpoint<\/h2>\n@app.get(\"\/\", summary=\"Uygulaman\u0131n \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 kontrol et\")\nasync def root():\n    return {\"message\": \"FastAPI uygulamas\u0131 \u00e7al\u0131\u015f\u0131yor!\"}\n\n<h2>Kullan\u0131c\u0131 olu\u015fturma endpoint'i<\/h2>\n@app.post(\"\/users\/\", response_model=schemas.User, status_code=status.HTTP_201_CREATED, summary=\"Yeni kullan\u0131c\u0131 olu\u015ftur\")\ndef create_user(user: schemas.UserCreate, db: Session = Depends(get_db)):\n    db_user = crud.get_user_by_email(db, email=user.email)\n    if db_user:\n        raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=\"E-posta zaten kay\u0131tl\u0131\")\n    return crud.create_user(db=db, user=user)\n\n<h2>T\u00fcm kullan\u0131c\u0131lar\u0131 listeleme endpoint'i (sayfalama ile)<\/h2>\n@app.get(\"\/users\/\", response_model=List[schemas.User], summary=\"T\u00fcm kullan\u0131c\u0131lar\u0131 listele\")\ndef read_users(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):\n    users = crud.get_users(db, skip=skip, limit=limit)\n    return users\n\n<h2>Belirli bir kullan\u0131c\u0131y\u0131 ID'ye g\u00f6re getirme endpoint'i<\/h2>\n@app.get(\"\/users\/{user_id}\", response_model=schemas.User, summary=\"ID'ye g\u00f6re kullan\u0131c\u0131 getir\")\ndef read_user(user_id: int, db: Session = Depends(get_db)):\n    db_user = crud.get_user(db, user_id=user_id)\n    if db_user is None:\n        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=\"Kullan\u0131c\u0131 bulunamad\u0131\")\n    return db_user\n\n<h2>Kullan\u0131c\u0131 g\u00fcncelleme endpoint'i<\/h2>\n@app.put(\"\/users\/{user_id}\", response_model=schemas.User, summary=\"Kullan\u0131c\u0131 bilgilerini g\u00fcncelle\")\ndef update_user(user_id: int, user_update: schemas.UserUpdate, db: Session = Depends(get_db)):\n    db_user = crud.get_user(db, user_id=user_id)\n    if db_user is None:\n        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=\"Kullan\u0131c\u0131 bulunamad\u0131\")\n\n    # E-posta g\u00fcncelleniyorsa ve zaten kullan\u0131l\u0131yorsa kontrol et\n    if user_update.email and user_update.email != db_user.email:\n        existing_user = crud.get_user_by_email(db, email=user_update.email)\n        if existing_user:\n            raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=\"Bu e-posta zaten ba\u015fka bir kullan\u0131c\u0131 taraf\u0131ndan kullan\u0131l\u0131yor\")\n\n    updated_user = crud.update_user(db=db, user_id=user_id, user_update=user_update)\n    return updated_user\n\n<h2>Kullan\u0131c\u0131 silme endpoint'i<\/h2>\n@app.delete(\"\/users\/{user_id}\", status_code=status.HTTP_204_NO_CONTENT, summary=\"Kullan\u0131c\u0131y\u0131 sil\")\ndef delete_user(user_id: int, db: Session = Depends(get_db)):\n    if not crud.delete_user(db, user_id=user_id):\n        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=\"Kullan\u0131c\u0131 bulunamad\u0131\")\n    return {\"message\": \"Kullan\u0131c\u0131 ba\u015far\u0131yla silindi\"}\n\n<h2>Toplam kullan\u0131c\u0131 say\u0131s\u0131n\u0131 getiren endpoint<\/h2>\n@app.get(\"\/users\/count\/\", summary=\"Toplam kullan\u0131c\u0131 say\u0131s\u0131n\u0131 getir\")\ndef get_total_users_count(db: Session = Depends(get_db)):\n    count = crud.get_users_count(db)\n    return {\"total_users\": count}<\/code><\/pre>\n<p><strong>A\u00e7\u0131klamalar:<\/strong><\/p>\n<p>*   <code>FastAPI()<\/code>: FastAPI uygulamas\u0131n\u0131n bir \u00f6rne\u011fini olu\u015fturur. <code>title<\/code>, <code>description<\/code>, <code>version<\/code> gibi parametreler OpenAPI dok\u00fcmantasyonunda g\u00f6r\u00fcn\u00fcr.<br \/>\n*   <code>models.Base.metadata.create_all(bind=engine)<\/code>: Bu sat\u0131r, <code>models.py<\/code> dosyas\u0131nda tan\u0131mlanan t\u00fcm tablolar\u0131 veritaban\u0131nda olu\u015fturur. <strong>Ancak, Alembic gibi bir migrasyon arac\u0131 kullan\u0131yorsan\u0131z, bu sat\u0131r\u0131 yorum sat\u0131r\u0131 yapmal\u0131 veya kald\u0131rmal\u0131s\u0131n\u0131z.<\/strong> Aksi takdirde, Alembic&#8217;in sorumlulu\u011fundaki veritaban\u0131 \u015fema y\u00f6netimini atlam\u0131\u015f olursunuz.<br \/>\n*   <code>@app.post<\/code>, <code>@app.get<\/code>, <code>@app.put<\/code>, <code>@app.delete<\/code>: FastAPI&#8217;nin HTTP metotlar\u0131na kar\u015f\u0131l\u0131k gelen dekorat\u00f6rleridir. API u\u00e7 noktalar\u0131n\u0131 tan\u0131mlar.<br \/>\n*   <code>response_model=schemas.User<\/code>: FastAPI&#8217;ye bu u\u00e7 noktan\u0131n yan\u0131t\u0131n\u0131n <code>schemas.User<\/code> Pydantic modeline uygun olaca\u011f\u0131n\u0131 bildirir. Bu, otomatik dok\u00fcmantasyon ve yan\u0131t serile\u015ftirmesi i\u00e7in \u00f6nemlidir.<br \/>\n*   <code>status_code=...<\/code>: Yan\u0131t\u0131n HTTP durum kodunu belirtir.<br \/>\n*   <code>db: Session = Depends(get_db)<\/code>: FastAPI&#8217;nin ba\u011f\u0131ml\u0131l\u0131k enjeksiyon sistemidir. Her istekte <code>get_db<\/code> fonksiyonunu \u00e7a\u011f\u0131rarak bir veritaban\u0131 oturumu (Session) sa\u011flar ve istek tamamland\u0131\u011f\u0131nda oturumu kapat\u0131r.<br \/>\n*   <code>HTTPException<\/code>: Bir hata durumu olu\u015ftu\u011funda belirli bir HTTP durum kodu ve detay mesaj\u0131 ile yan\u0131t d\u00f6nmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h2>Uygulamay\u0131 \u00c7al\u0131\u015ft\u0131rma<\/h2>\n<p>FastAPI uygulaman\u0131z\u0131 Uvicorn ASGI sunucusu ile \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/p>\n<pre><code class=\"language-bash\">uvicorn main:app --reload<\/code><\/pre>\n<p>*   <code>main<\/code>: <code>main.py<\/code> dosyas\u0131n\u0131n ad\u0131d\u0131r.<br \/>\n*   <code>app<\/code>: <code>main.py<\/code> dosyas\u0131ndaki <code>FastAPI()<\/code> \u00f6rne\u011finin ad\u0131d\u0131r.<br \/>\n*   <code>--reload<\/code>: Kodunuzda yapt\u0131\u011f\u0131n\u0131z de\u011fi\u015fiklikleri otomatik olarak alg\u0131lar ve sunucuyu yeniden ba\u015flat\u0131r, bu da geli\u015ftirme s\u00fcrecinde \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p>Uygulama \u00e7al\u0131\u015fmaya ba\u015flad\u0131\u011f\u0131nda, terminalde \u015f\u00f6yle bir \u00e7\u0131kt\u0131 g\u00f6rmelisiniz:<\/p>\n<pre><code class=\"language-\">INFO:     Will watch for changes in these directories: ['\/home\/youruser\/fastapidb_app']\nINFO:     Uvicorn running on http:\/\/127.0.0.1:8000 (Press CTRL+C to quit)\nINFO:     Started reloader process [xxxxx] using statreload\nINFO:     Started server process [xxxxx]\nINFO:     Waiting for application startup.\nINFO:     Application startup complete.<\/code><\/pre>\n<p>\u015eimdi bir web taray\u0131c\u0131s\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki adreslere gidin:<\/p>\n<p>*   <strong>API Dok\u00fcmantasyonu (Swagger UI):<\/strong> <code>http:\/\/127.0.0.1:8000\/docs<\/code><br \/>\n*   <strong>Alternatif Dok\u00fcmantasyon (ReDoc):<\/strong> <code>http:\/\/127.0.0.1:8000\/redoc<\/code><\/p>\n<p>Bu aray\u00fczler sayesinde, olu\u015fturdu\u011funuz API u\u00e7 noktalar\u0131n\u0131 g\u00f6rsel olarak inceleyebilir, istekler g\u00f6nderebilir ve yan\u0131tlar\u0131 g\u00f6rebilirsiniz.<\/p>\n<h2>Veritaban\u0131 Migrasyonlar\u0131 (Alembic ile)<\/h2>\n<p>Uygulama geli\u015ftirme s\u00fcrecinde veritaban\u0131 \u015feman\u0131z\u0131n zamanla de\u011fi\u015fmesi ka\u00e7\u0131n\u0131lmazd\u0131r (yeni tablolar ekleme, mevcut tablolar\u0131 de\u011fi\u015ftirme, s\u00fctun ekleme\/\u00e7\u0131karma vb.). Veritaban\u0131 migrasyonlar\u0131, bu \u015fema de\u011fi\u015fikliklerini s\u00fcr\u00fcm kontrol\u00fc alt\u0131nda y\u00f6netmenizi sa\u011flar. Alembic, SQLAlchemy ile entegre \u00e7al\u0131\u015fan pop\u00fcler bir migrasyon arac\u0131d\u0131r.<\/p>\n<h3>Neden Migrasyonlar?<\/h3>\n<p>*   <strong>S\u00fcr\u00fcm Kontrol\u00fc:<\/strong> Veritaban\u0131 \u015fema de\u011fi\u015fiklikleri kodunuz gibi s\u00fcr\u00fcm kontrol\u00fc alt\u0131nda tutulur.<br \/>\n*   <strong>Geli\u015ftirici \u0130\u015fbirli\u011fi:<\/strong> Birden fazla geli\u015ftiricinin ayn\u0131 veritaban\u0131 \u015femas\u0131 \u00fczerinde \u00e7al\u0131\u015fmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Otomasyon:<\/strong> \u015eema de\u011fi\u015fikliklerini test ve \u00fcretim ortamlar\u0131na otomatik olarak uygulamay\u0131 sa\u011flar.<br \/>\n*   <strong>Geri Alma Yetene\u011fi:<\/strong> Yanl\u0131\u015f bir migrasyonu geri alma veya belirli bir \u015fema s\u00fcr\u00fcm\u00fcne d\u00f6nme yetene\u011fi sunar.<\/p>\n<h3>Alembic Kurulumu<\/h3>\n<p>Daha \u00f6nce <code>pip install alembic<\/code> komutuyla Alembic&#8217;i kurmu\u015ftuk.<\/p>\n<h3>Alembic Projesini Ba\u015flatma<\/h3>\n<p>Proje dizininizin k\u00f6k\u00fcnde (yani <code>fastapidb_app<\/code> i\u00e7inde), Alembic projesini ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">alembic init alembic<\/code><\/pre>\n<p>Bu komut, <code>alembic<\/code> ad\u0131nda bir dizin ve <code>alembic.ini<\/code> ad\u0131nda bir yap\u0131land\u0131rma dosyas\u0131 olu\u015fturacakt\u0131r.<\/p>\n<p>*   <code>alembic.ini<\/code>: Alembic&#8217;in genel yap\u0131land\u0131rma ayarlar\u0131n\u0131 i\u00e7erir.<br \/>\n*   <code>alembic\/versions\/<\/code>: Migrasyon dosyalar\u0131n\u0131n depoland\u0131\u011f\u0131 yer.<br \/>\n*   <code>alembic\/env.py<\/code>: Alembic&#8217;in veritaban\u0131yla nas\u0131l etkile\u015fim kuraca\u011f\u0131n\u0131 tan\u0131mlayan Python beti\u011fi.<\/p>\n<h3><code>alembic.ini<\/code> Yap\u0131land\u0131rmas\u0131<\/h3>\n<p><code>alembic.ini<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve <code>sqlalchemy.url<\/code> sat\u0131r\u0131n\u0131 veritaban\u0131 ba\u011flant\u0131 dizinizle g\u00fcncelleyin:<\/p>\n<pre><code class=\"language-ini\"># alembic.ini\n\n<h2>... di\u011fer ayarlar ...<\/h2>\n\nsqlalchemy.url = postgresql:\/\/fastapiuser:your_strong_password@localhost\/fastapidb\n\n<h2>... di\u011fer ayarlar ...<\/code><\/pre>\n<\/h2>\n<p>Ayr\u0131ca, Alembic&#8217;in SQLAlchemy ORM modellerinizi (<code>models.py<\/code> dosyas\u0131ndaki <code>Base<\/code>) tan\u0131mas\u0131 i\u00e7in <code>alembic\/env.py<\/code> dosyas\u0131n\u0131 d\u00fczenlemeniz gerekir. <code>env.py<\/code> dosyas\u0131nda <code>target_metadata = None<\/code> sat\u0131r\u0131n\u0131 bulun ve a\u015fa\u011f\u0131daki gibi de\u011fi\u015ftirin:<\/p>\n<pre><code class=\"language-python\"># alembic\/env.py\n\n<h2>... di\u011fer i\u00e7e aktarmalar ...<\/h2>\nfrom fastapidb_app.database import Base\nfrom fastapidb_app import models # models.py dosyas\u0131n\u0131 da import etti\u011finizden emin olun\n\n<h2>... di\u011fer ayarlar ...<\/h2>\n\n<h2>target_metadata, SQLAlchemy Base nesnesidir, Alembic'in \u015fema de\u011fi\u015fikliklerini alg\u0131lamas\u0131 i\u00e7in gereklidir.<\/h2>\ntarget_metadata = Base.metadata\n\n<h2>... di\u011fer ayarlar ...<\/code><\/pre>\n<\/h2>\n<p>Bu de\u011fi\u015fiklik, Alembic&#8217;in <code>Base.metadata<\/code> i\u00e7indeki t\u00fcm tan\u0131ml\u0131 modelleri g\u00f6rmesini ve veritaban\u0131 \u015femas\u0131n\u0131 bu modellere g\u00f6re kar\u015f\u0131la\u015ft\u0131rmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Migrasyon Olu\u015fturma ve Uygulama<\/h3>\n<p>\u015eimdi ilk migrasyonumuzu olu\u015ftural\u0131m. Bu migrasyon, <code>models.py<\/code> dosyas\u0131nda tan\u0131mlad\u0131\u011f\u0131m\u0131z <code>User<\/code> tablosunu veritaban\u0131nda olu\u015fturacakt\u0131r.<\/p>\n<pre><code class=\"language-bash\">alembic revision --autogenerate -m \"Create User table\"<\/code><\/pre>\n<p>*   <code>revision<\/code>: Yeni bir migrasyon dosyas\u0131 olu\u015fturur.<br \/>\n*   <code>--autogenerate<\/code>: Alembic&#8217;in mevcut veritaban\u0131 \u015femas\u0131 ile <code>models.py<\/code> dosyas\u0131ndaki tan\u0131mlar aras\u0131ndaki farklar\u0131 otomatik olarak alg\u0131lamas\u0131n\u0131 ve migrasyon beti\u011fini olu\u015fturmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <code>-m \"Create User table\"<\/code>: Migrasyona a\u00e7\u0131klay\u0131c\u0131 bir mesaj ekler.<\/p>\n<p>Bu komut, <code>alembic\/versions\/<\/code> dizininde zaman damgas\u0131 i\u00e7eren bir Python dosyas\u0131 olu\u015fturacakt\u0131r. Bu dosyay\u0131 a\u00e7\u0131p otomatik olarak olu\u015fturulan <code>upgrade()<\/code> ve <code>downgrade()<\/code> fonksiyonlar\u0131n\u0131 inceleyebilirsiniz.<\/p>\n<p>Migrasyon dosyas\u0131n\u0131 olu\u015fturduktan sonra, bu migrasyonu veritaban\u0131na uygulamak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">alembic upgrade head<\/code><\/pre>\n<p>*   <code>upgrade<\/code>: Migrasyonlar\u0131 uygular.<br \/>\n*   <code>head<\/code>: En son migrasyonu uygula anlam\u0131na gelir.<\/p>\n<p>Art\u0131k veritaban\u0131n\u0131zda <code>users<\/code> tablosu olu\u015fturulmu\u015f olmal\u0131d\u0131r. Bu ad\u0131mdan sonra <code>main.py<\/code> dosyas\u0131ndaki <code>models.Base.metadata.create_all(bind=engine)<\/code> sat\u0131r\u0131n\u0131 kesinlikle yorum sat\u0131r\u0131 yap\u0131n veya silin. Aksi takdirde, Alembic&#8217;in y\u00f6netimini atlam\u0131\u015f olursunuz.<\/p>\n<p>Daha sonra <code>models.py<\/code> dosyan\u0131zda bir de\u011fi\u015fiklik yapt\u0131\u011f\u0131n\u0131zda (\u00f6rne\u011fin, <code>User<\/code> modeline yeni bir s\u00fctun ekledi\u011finizde), sadece <code>alembic revision --autogenerate -m \"Add new column to User\"<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131n ve ard\u0131ndan <code>alembic upgrade head<\/code> ile uygulay\u0131n.<\/p>\n<h2>G\u00fcvenlik ve Performans \u0130pu\u00e7lar\u0131<\/h2>\n<p>FastAPI ve ili\u015fkisel veritaban\u0131 kullanan bir uygulamay\u0131 geli\u015ftirirken g\u00fcvenlik ve performans her zaman \u00f6n planda olmal\u0131d\u0131r.<\/p>\n<h3>G\u00fcvenlik<\/h3>\n<p>*   <strong>Parola Hash&#8217;leme:<\/strong> Asla d\u00fcz metin parolalar\u0131 veritaban\u0131nda saklamay\u0131n. <code>passlib<\/code> gibi k\u00fct\u00fcphaneler kullanarak parolalar\u0131 g\u00fcvenli bir \u015fekilde hash&#8217;leyin (bcrypt \u00f6nerilir).<br \/>\n*   <strong>Kimlik Do\u011frulama ve Yetkilendirme:<\/strong> Kullan\u0131c\u0131lar\u0131 do\u011frulamak ve yetkilendirmek i\u00e7in JWT (JSON Web Tokens), OAuth2 veya API Anahtarlar\u0131 gibi standart mekanizmalar\u0131 kullan\u0131n. FastAPI, OAuth2 ile entegrasyon i\u00e7in yerle\u015fik ara\u00e7lara sahiptir.<br \/>\n*   <strong>Ortam De\u011fi\u015fkenleri:<\/strong> Hassas bilgileri (veritaban\u0131 kimlik bilgileri, API anahtarlar\u0131 vb.) do\u011frudan koda yazmak yerine ortam de\u011fi\u015fkenleri (<code>.env<\/code> dosyas\u0131 ve <code>python-dotenv<\/code> k\u00fct\u00fcphanesi ile) kullanarak y\u00f6netin.<br \/>\n*   <strong>Giri\u015f Do\u011frulamas\u0131:<\/strong> Pydantic kullanarak API giri\u015f verilerini titizlikle do\u011frulay\u0131n. Bu, SQL enjeksiyonu ve XSS gibi yayg\u0131n g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 \u00f6nlemeye yard\u0131mc\u0131 olur.<br \/>\n*   <strong>HTTPS Kullan\u0131m\u0131:<\/strong> \u00dcretim ortam\u0131nda her zaman HTTPS kullan\u0131n.<br \/>\n*   <strong>CORS (Cross-Origin Resource Sharing):<\/strong> API&#8217;nize eri\u015febilecek alan adlar\u0131n\u0131 dikkatlice yap\u0131land\u0131r\u0131n.<\/p>\n<h3>Performans<\/h3>\n<p>*   <strong>Asenkron Veritaban\u0131 S\u00fcr\u00fcc\u00fcleri:<\/strong> <code>psycopg2-binary<\/code> gibi senkron s\u00fcr\u00fcc\u00fcler yerine <code>asyncpg<\/code> (PostgreSQL i\u00e7in) veya <code>asyncmy<\/code> (MySQL i\u00e7in) gibi asenkron veritaban\u0131 s\u00fcr\u00fcc\u00fcleri kullanmay\u0131 d\u00fc\u015f\u00fcn\u00fcn. Bu, veritaban\u0131 I\/O i\u015flemlerini beklerken FastAPI&#8217;nin di\u011fer g\u00f6revleri i\u015flemesine olanak tan\u0131r.<br \/>\n    *   <code>pip install asyncpg sqlalchemy[asyncio]<\/code> (PostgreSQL i\u00e7in)<br \/>\n    *   <code>create_engine<\/code> yerine <code>create_async_engine<\/code> kullan\u0131n ve <code>SessionLocal<\/code> yerine <code>async_sessionmaker<\/code> kullan\u0131n.<br \/>\n    *   <code>get_db<\/code> fonksiyonunuzu da asenkron yapman\u0131z gerekir (<code>async def get_db(): async with SessionLocal() as session: yield session<\/code>).<br \/>\n*   <strong>Veritaban\u0131 Ba\u011flant\u0131 Havuzlar\u0131:<\/strong> SQLAlchemy&#8217;nin varsay\u0131lan olarak bir ba\u011flant\u0131 havuzu vard\u0131r, ancak performans ihtiya\u00e7lar\u0131n\u0131za g\u00f6re boyutunu ve davran\u0131\u015f\u0131n\u0131 ayarlayabilirsiniz.<br \/>\n*   <strong>Sorgu Optimizasyonu:<\/strong> N+1 sorgu sorunlar\u0131ndan ka\u00e7\u0131n\u0131n. <code>relationship<\/code> y\u00fcklemesini <code>selectinload<\/code> veya <code>joinedload<\/code> ile optimize edin.<br \/>\n*   <strong>\u0130ndeksleme:<\/strong> Veritaban\u0131 tablolar\u0131n\u0131zda s\u0131k\u00e7a sorgulanan s\u00fctunlar \u00fczerinde uygun indeksler olu\u015fturun.<br \/>\n*   <strong>\u00d6nbellekleme:<\/strong> S\u0131k eri\u015filen ancak nadiren de\u011fi\u015fen veriler i\u00e7in Redis veya Memcached gibi bir \u00f6nbellekleme katman\u0131 kullan\u0131n.<br \/>\n*   <strong>Sayfalama:<\/strong> B\u00fcy\u00fck veri k\u00fcmelerini d\u00f6nd\u00fcr\u00fcrken API&#8217;lerde sayfalama (<code>skip<\/code> ve <code>limit<\/code> parametreleri gibi) uygulay\u0131n.<br \/>\n*   <strong>Gunicorn ile \u00c7al\u0131\u015ft\u0131rma:<\/strong> \u00dcretim ortam\u0131nda Uvicorn&#8217;u do\u011frudan \u00e7al\u0131\u015ft\u0131rmak yerine, Gunicorn gibi bir WSGI\/ASGI sunucusu arkas\u0131nda birden fazla worker ile \u00e7al\u0131\u015ft\u0131rmak daha iyi performans ve kararl\u0131l\u0131k sa\u011flar.<br \/>\n    *   <code>pip install gunicorn<\/code><br \/>\n    *   <code>gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app<\/code> (4 worker ile \u00e7al\u0131\u015ft\u0131rma \u00f6rne\u011fi)<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Bu kapsaml\u0131 makalede, Ubuntu \u00fczerinde FastAPI&#8217;yi bir ili\u015fkisel veritaban\u0131 olan PostgreSQL ile nas\u0131l entegre edece\u011fimizi ad\u0131m ad\u0131m inceledik. Python sanal ortam\u0131 kurulumundan ba\u015flayarak, PostgreSQL veritaban\u0131 ve kullan\u0131c\u0131s\u0131 olu\u015fturmaya, FastAPI, SQLAlchemy ve Pydantic k\u00fct\u00fcphanelerini kullanarak bir API olu\u015fturmaya kadar bir\u00e7ok konuyu ele ald\u0131k. Ayr\u0131ca, veritaban\u0131 \u015fema de\u011fi\u015fikliklerini y\u00f6netmek i\u00e7in Alembic migrasyon arac\u0131n\u0131n \u00f6nemini ve kullan\u0131m\u0131n\u0131 da \u00f6\u011frendik.<\/p>\n<p>FastAPI&#8217;nin modern, asenkron yap\u0131s\u0131 ve Pydantic&#8217;in g\u00fc\u00e7l\u00fc veri do\u011frulama yetenekleri, SQLAlchemy&#8217;nin esnek ORM&#8217;i ile birle\u015fti\u011finde, h\u0131zl\u0131, g\u00fcvenilir ve bak\u0131m\u0131 kolay web API&#8217;lar\u0131 geli\u015ftirmeniz i\u00e7in sa\u011flam bir temel sunar. \u0130li\u015fkisel veritabanlar\u0131n\u0131n yap\u0131sal b\u00fct\u00fcnl\u00fc\u011f\u00fc ve sorgu yetenekleri, bu kombinasyonu bir\u00e7ok karma\u015f\u0131k i\u015f uygulamas\u0131 i\u00e7in ideal hale getirir.<\/p>\n<p>Bu rehber, temel bir kullan\u0131c\u0131 y\u00f6netimi API&#8217;si \u00f6rne\u011fi \u00fczerinden ilerlemi\u015f olsa da, burada \u00f6\u011frenilen prensipler ve teknikler, daha karma\u015f\u0131k ve b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar i\u00e7in de ge\u00e7erlidir. Bir sonraki ad\u0131m olarak, uygulaman\u0131za kimlik do\u011frulama (JWT veya OAuth2), daha geli\u015fmi\u015f hata y\u00f6netimi, test yaz\u0131m\u0131 ve \u00fcretim ortam\u0131na da\u011f\u0131t\u0131m gibi \u00f6zellikleri eklemeyi d\u00fc\u015f\u00fcnebilirsiniz. Unutmay\u0131n, iyi bir yaz\u0131l\u0131m geli\u015ftirme prati\u011fi, s\u00fcrekli \u00f6\u011frenmeyi ve g\u00fcvenlik ile performans optimizasyonlar\u0131na dikkat etmeyi gerektirir.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"FastAPI ve \u0130li\u015fkisel Veritaban\u0131 Kullan\u0131m\u0131 (Ubuntu \u00dczerinde)\nModern web uygulamalar\u0131 geli\u015ftirirken, h\u0131zl\u0131 ve etkili API&#8217;lar olu\u015fturmak krit","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1468],"tags":[],"class_list":{"0":"post-37375","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ubuntu","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>FastAPI ve \u0130li\u015fkisel Veritaban\u0131 Kullan\u0131m\u0131 (Ubuntu \u00dczerinde) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"FastAPI ve \u0130li\u015fkisel Veritaban\u0131 Kullan\u0131m\u0131 (Ubuntu \u00dczerinde)\" \/>\n<meta property=\"og:description\" content=\"FastAPI ve \u0130li\u015fkisel Veritaban\u0131 Kullan\u0131m\u0131 (Ubuntu \u00dczerinde) Modern web uygulamalar\u0131 geli\u015ftirirken, h\u0131zl\u0131 ve etkili API&#039;lar olu\u015fturmak krit\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-01T18:41:03+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"26 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"FastAPI ve \u0130li\u015fkisel Veritaban\u0131 Kullan\u0131m\u0131 (Ubuntu \u00dczerinde)\",\"datePublished\":\"2026-01-01T18:41:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/\"},\"wordCount\":3143,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Ubuntu\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/\",\"name\":\"FastAPI ve \u0130li\u015fkisel Veritaban\u0131 Kullan\u0131m\u0131 (Ubuntu \u00dczerinde) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-01T18:41:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"FastAPI ve \u0130li\u015fkisel Veritaban\u0131 Kullan\u0131m\u0131 (Ubuntu \u00dczerinde)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"FastAPI ve \u0130li\u015fkisel Veritaban\u0131 Kullan\u0131m\u0131 (Ubuntu \u00dczerinde) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/","og_locale":"tr_TR","og_type":"article","og_title":"FastAPI ve \u0130li\u015fkisel Veritaban\u0131 Kullan\u0131m\u0131 (Ubuntu \u00dczerinde)","og_description":"FastAPI ve \u0130li\u015fkisel Veritaban\u0131 Kullan\u0131m\u0131 (Ubuntu \u00dczerinde) Modern web uygulamalar\u0131 geli\u015ftirirken, h\u0131zl\u0131 ve etkili API'lar olu\u015fturmak krit","og_url":"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-01T18:41:03+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"26 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"FastAPI ve \u0130li\u015fkisel Veritaban\u0131 Kullan\u0131m\u0131 (Ubuntu \u00dczerinde)","datePublished":"2026-01-01T18:41:03+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/"},"wordCount":3143,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Ubuntu"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/","url":"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/","name":"FastAPI ve \u0130li\u015fkisel Veritaban\u0131 Kullan\u0131m\u0131 (Ubuntu \u00dczerinde) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-01T18:41:03+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-ve-iliskisel-veritabani-kullanimi-ubuntu-uzerinde\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"FastAPI ve \u0130li\u015fkisel Veritaban\u0131 Kullan\u0131m\u0131 (Ubuntu \u00dczerinde)"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37375","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=37375"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37375\/revisions"}],"predecessor-version":[{"id":37376,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37375\/revisions\/37376"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37375"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37375"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37375"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}