{"id":36036,"date":"2025-12-07T04:30:53","date_gmt":"2025-12-07T01:30:53","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/"},"modified":"2025-12-07T04:30:53","modified_gmt":"2025-12-07T01:30:53","slug":"giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/","title":{"rendered":"Giri\u015f: Veritaban\u0131 Ge\u00e7i\u015fleri Neden Kritik Bir \u00d6neme Sahip?"},"content":{"rendered":"<p><span>Veritaban\u0131 Ge\u00e7i\u015fleri: Migrate ile Sorunsuz Y\u00f6netim<\/span><\/p>\n<p>Veritaban\u0131 \u015feman\u0131z\u0131 projelerinizde sorunsuz bir \u015fekilde y\u00f6netmek mi istiyorsunuz? Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e veritaban\u0131 yap\u0131s\u0131nda yap\u0131lan de\u011fi\u015fiklikler karma\u015f\u0131k hale gelebilir. Migrate arac\u0131 ile veritaban\u0131 ge\u00e7i\u015flerini ad\u0131m ad\u0131m nas\u0131l y\u00f6netece\u011finizi bu detayl\u0131 rehberde ke\u015ffedin, \u015fema y\u00f6netimini basitle\u015ftirin ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi h\u0131zland\u0131r\u0131n.<\/p>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde, bir uygulaman\u0131n veritaban\u0131 \u015femas\u0131 nadiren sabit kal\u0131r. Yeni \u00f6zellikler ekledik\u00e7e, performans iyile\u015ftirmeleri yapt\u0131k\u00e7a veya hatalar\u0131 d\u00fczelttik\u00e7e, mevcut tablolara yeni s\u00fctunlar eklemek, eski s\u00fctunlar\u0131 kald\u0131rmak, tablolar\u0131 yeniden adland\u0131rmak ya da indeksler olu\u015fturmak gibi de\u011fi\u015fiklikler yapmam\u0131z ka\u00e7\u0131n\u0131lmaz hale gelir. \u0130\u015fte tam bu noktada veritaban\u0131 ge\u00e7i\u015fleri (database migrations) devreye girer. Ge\u00e7i\u015fler, veritaban\u0131 \u015feman\u0131zdaki bu de\u011fi\u015fiklikleri s\u00fcr\u00fcm kontrol sistemine entegre ederek, ekip \u00fcyeleri aras\u0131nda tutarl\u0131l\u0131k sa\u011flaman\u0131n ve canl\u0131 sistemlere g\u00fcvenli bir \u015fekilde da\u011f\u0131t\u0131m yapman\u0131n anahtar\u0131d\u0131r. Ancak, bu s\u00fcre\u00e7leri manuel olarak y\u00f6netmek, \u00f6zellikle b\u00fcy\u00fck ve dinamik projelerde kabusa d\u00f6n\u00fc\u015febilir. Hangi de\u011fi\u015fiklik ne zaman yap\u0131ld\u0131? Hangi ortamda hangi s\u00fcr\u00fcm ge\u00e7erli? Geri alma (rollback) i\u015flemleri nas\u0131l yap\u0131lacak? Bu t\u00fcr sorular\u0131n cevaplar\u0131 manuel y\u00f6netimle zorla\u015f\u0131r ve insan hatas\u0131na a\u00e7\u0131k hale gelir.<\/p>\n<p>Veritaban\u0131 ge\u00e7i\u015f ara\u00e7lar\u0131 olmasayd\u0131, geli\u015ftiriciler genellikle SQL komut dosyalar\u0131n\u0131 elle yaz\u0131p y\u00f6netirlerdi. Bu durum, zamanla biriken SQL dosyalar\u0131n\u0131n karma\u015fas\u0131na, farkl\u0131 geli\u015ftiricilerin ayn\u0131 dosyalar \u00fczerinde \u00e7ak\u0131\u015fmalar ya\u015famas\u0131na ve \u00f6zellikle &#8220;down&#8221; (geri alma) operasyonlar\u0131 i\u00e7in tersine m\u00fchendislik yapma zorunlulu\u011funa yol a\u00e7ard\u0131. Da\u011f\u0131t\u0131m s\u0131ras\u0131nda yanl\u0131\u015f s\u0131ralama, eksik bir komut veya uyumsuz bir de\u011fi\u015fiklik, t\u00fcm uygulaman\u0131n \u00e7\u00f6kmesine veya veri kayb\u0131na neden olabilirdi. Bu riskler, \u00f6zellikle birden fazla geli\u015ftiricinin ayn\u0131 veritaban\u0131 \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131 ve s\u00fcrekli yeni \u00f6zelliklerin eklendi\u011fi projelerde katlanarak artar. Bu ba\u011flamda, <code>Migrate<\/code> gibi g\u00fc\u00e7l\u00fc ve esnek bir ge\u00e7i\u015f arac\u0131 kullanmak, geli\u015ftirme ekibinin verimlili\u011fini art\u0131rman\u0131n yan\u0131 s\u0131ra, uygulama ve veritaban\u0131 tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flamak i\u00e7in hayati bir rol oynar. B\u00f6ylece, veritaban\u0131 \u015femas\u0131ndaki her de\u011fi\u015fiklik, kontroll\u00fc, izlenebilir ve geri al\u0131nabilir bir s\u00fcre\u00e7 haline gelir. Ayr\u0131ca, geli\u015ftiricilerin veritaban\u0131 de\u011fi\u015fiklikleri konusunda daha g\u00fcvenle hareket etmelerini sa\u011flayarak, inovasyona daha fazla odaklanmalar\u0131na olanak tan\u0131r.<\/p>\n<h2>Temel Kavramlar: Veritaban\u0131 Ge\u00e7i\u015fleri ve Migrate Arac\u0131 Nedir?<\/h2>\n<p>Veritaban\u0131 ge\u00e7i\u015fleri, veritaban\u0131 \u015femas\u0131nda zaman i\u00e7inde meydana gelen de\u011fi\u015fiklikleri izlemek, uygulamak ve y\u00f6netmek i\u00e7in kullan\u0131lan yap\u0131land\u0131r\u0131lm\u0131\u015f bir yakla\u015f\u0131md\u0131r. Her ge\u00e7i\u015f, genellikle bir &#8220;yukar\u0131&#8221; (up) ve bir &#8220;a\u015fa\u011f\u0131&#8221; (down) komutu i\u00e7eren iki par\u00e7al\u0131 bir i\u015flemdir. &#8220;Yukar\u0131&#8221; komutu, \u015femay\u0131 bir sonraki duruma ta\u015f\u0131mak i\u00e7in gerekli SQL (veya ba\u015fka bir dil) komutlar\u0131n\u0131 i\u00e7erirken, &#8220;a\u015fa\u011f\u0131&#8221; komutu ise bu de\u011fi\u015fikli\u011fi geri almak veya \u00f6nceki duruma d\u00f6nmek i\u00e7in gereken komutlar\u0131 bar\u0131nd\u0131r\u0131r. Bu \u00e7ift y\u00f6nl\u00fc yap\u0131, herhangi bir \u015fema de\u011fi\u015fikli\u011finin hem uygulanabilir hem de geri al\u0131nabilir olmas\u0131n\u0131 sa\u011flar, bu da geli\u015ftirme ve \u00fcretim ortamlar\u0131nda esneklik a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir. Veritaban\u0131 ge\u00e7i\u015fleri, ayn\u0131 zamanda, farkl\u0131 geli\u015ftirme ortamlar\u0131, test ortamlar\u0131 ve canl\u0131 sistemler aras\u0131nda veritaban\u0131 \u015femas\u0131n\u0131n tutarl\u0131 kalmas\u0131n\u0131 garanti eder. Bu sayede, &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yordu&#8221; gibi yayg\u0131n sorunlar\u0131n \u00f6n\u00fcne ge\u00e7ilir ve t\u00fcm ekibin ayn\u0131 veritaban\u0131 yap\u0131s\u0131 \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olunur.<\/p>\n<p><code>Migrate<\/code>, Go dilinde yaz\u0131lm\u0131\u015f, a\u00e7\u0131k kaynakl\u0131 ve kullan\u0131m\u0131 kolay bir veritaban\u0131 ge\u00e7i\u015f arac\u0131d\u0131r. \u00d6zellikle basitli\u011fi, h\u0131z\u0131 ve \u00e7oklu veritaban\u0131 deste\u011fiyle \u00f6ne \u00e7\u0131kar. PostgreSQL, MySQL, SQLite3, SQL Server, Oracle, CockroachDB gibi bir\u00e7ok pop\u00fcler veritaban\u0131n\u0131 desteklerken, ayn\u0131 zamanda S3, GitHub, GCS gibi farkl\u0131 kaynaklardan ge\u00e7i\u015f dosyalar\u0131n\u0131 okuma yetene\u011fine de sahiptir. <code>Migrate<\/code>&#8216;in temel felsefesi, veritaban\u0131 ge\u00e7i\u015flerini basit SQL dosyalar\u0131 veya Go betikleri arac\u0131l\u0131\u011f\u0131yla y\u00f6netmektir, bu da geli\u015ftiricilere esneklik sunar. Her ge\u00e7i\u015f dosyas\u0131, benzersiz bir s\u00fcr\u00fcm numaras\u0131 ile etiketlenir ve <code>up.sql<\/code> ile <code>down.sql<\/code> \u00e7iftleri halinde d\u00fczenlenir. Bu yakla\u015f\u0131m, ge\u00e7i\u015flerin s\u0131ras\u0131n\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 a\u00e7\u0131k\u00e7a belirlemeyi kolayla\u015ft\u0131r\u0131r. <code>Migrate<\/code>, veritaban\u0131nda \u00f6zel bir <code>schema_migrations<\/code> tablosu tutarak uygulanan ge\u00e7i\u015flerin kayd\u0131n\u0131 tutar, b\u00f6ylece hangi ge\u00e7i\u015flerin uyguland\u0131\u011f\u0131n\u0131 ve veritaban\u0131n\u0131n hangi s\u00fcr\u00fcmde oldu\u011funu her zaman bilir. Bu sayede, <code>Migrate<\/code> arac\u0131 ile veritaban\u0131 \u015feman\u0131zdaki de\u011fi\u015fiklikleri g\u00fcvenle y\u00f6netebilir, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi otomatikle\u015ftirebilir ve olas\u0131 hatalar\u0131n \u00f6n\u00fcne ge\u00e7ebilirsiniz. Ayr\u0131ca, komut sat\u0131r\u0131 aray\u00fcz\u00fc (CLI) sayesinde kolayca kullan\u0131labilir olmas\u0131, arac\u0131 yeni ba\u015flayanlar i\u00e7in dahi eri\u015filebilir k\u0131lar.<\/p>\n<h2>Ad\u0131m Ad\u0131m Kurulum: Migrate Arac\u0131n\u0131 Sisteminize Nas\u0131l Entegre Edersiniz?<\/h2>\n<p><code>Migrate<\/code> arac\u0131n\u0131 kullanmaya ba\u015flamak olduk\u00e7a basittir ve genellikle birka\u00e7 ad\u0131m\u0131 i\u00e7erir. \u0130lk olarak, sisteminize <code>migrate<\/code> CLI arac\u0131n\u0131 kurman\u0131z gerekir. <code>Migrate<\/code>, Go dilinde yaz\u0131ld\u0131\u011f\u0131 i\u00e7in, e\u011fer sisteminizde Go geli\u015ftirme ortam\u0131 kuruluysa, do\u011frudan <code>go install<\/code> komutu ile kurulum yapabilirsiniz. Bu y\u00f6ntem, \u00f6zellikle Go tabanl\u0131 projelerde \u00e7al\u0131\u015fanlar i\u00e7in olduk\u00e7a pratiktir. E\u011fer Go kurulu de\u011filse veya ayr\u0131 bir ikili dosya olarak kullanmay\u0131 tercih ediyorsan\u0131z, <code>Migrate<\/code>&#8216;in GitHub sayfas\u0131ndan i\u015fletim sisteminize uygun haz\u0131r ikili dosyalar\u0131 indirebilirsiniz. Windows, macOS ve Linux i\u00e7in \u00f6nceden derlenmi\u015f s\u00fcr\u00fcmler mevcuttur. \u0130ndirdi\u011finiz ikili dosyay\u0131 <code>PATH<\/code> de\u011fi\u015fkeninize eklemek, komut sat\u0131r\u0131ndan <code>migrate<\/code> komutunu do\u011frudan \u00e7al\u0131\u015ft\u0131rman\u0131z\u0131 sa\u011flar. Kurulumun ard\u0131ndan, <code>migrate -version<\/code> komutu ile arac\u0131n ba\u015far\u0131yla kuruldu\u011funu ve do\u011fru \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 teyit edebilirsiniz. Bu ilk ad\u0131m, <code>migrate<\/code> ile veritaban\u0131 ge\u00e7i\u015flerini y\u00f6netmeye ba\u015flaman\u0131n temelini olu\u015fturur ve arac\u0131n fonksiyonlar\u0131n\u0131 ke\u015ffetmek i\u00e7in bir ba\u015flang\u0131\u00e7 noktas\u0131 sunar.<\/p>\n<p>Kurulum tamamland\u0131ktan sonra, <code>migrate<\/code> arac\u0131n\u0131n veritaban\u0131 ge\u00e7i\u015f dosyalar\u0131n\u0131 nerede bulaca\u011f\u0131n\u0131 belirtmeniz gerekir. Bu, genellikle projenizin k\u00f6k dizininde <code>migrations<\/code> ad\u0131nda bir dizin olu\u015fturarak yap\u0131l\u0131r. <code>Migrate<\/code>, bu dizini varsay\u0131lan kaynak (source) olarak kabul eder. Ge\u00e7i\u015f dosyalar\u0131n\u0131z\u0131 tutacak bu dizini olu\u015fturduktan sonra, art\u0131k <code>migrate<\/code> komutlar\u0131n\u0131 kullanmaya ba\u015flayabilirsiniz. \u00d6rne\u011fin, PostgreSQL ile \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131z\u0131 varsayal\u0131m. <code>Migrate<\/code> arac\u0131na veritaban\u0131 ba\u011flant\u0131 bilgilerini i\u00e7eren bir &#8220;database URL&#8221; sa\u011flaman\u0131z gerekecektir. Bu URL, <code>postgres:\/\/kullanici:sifre@host:port\/veritabani_adi?sslmode=disable<\/code> gibi bir formatta olabilir. G\u00fcvenlik nedeniyle, bu t\u00fcr hassas bilgileri do\u011frudan komut sat\u0131r\u0131nda ge\u00e7mek yerine, ortam de\u011fi\u015fkenleri (environment variables) veya bir yap\u0131land\u0131rma dosyas\u0131 kullanarak sa\u011flamak daha g\u00fcvenli bir yakla\u015f\u0131md\u0131r. Ayr\u0131ca, <code>migrate<\/code>&#8216;in hangi veritaban\u0131 s\u00fcr\u00fcc\u00fcs\u00fcn\u00fc kullanaca\u011f\u0131n\u0131 belirtmek i\u00e7in ilgili s\u00fcr\u00fcc\u00fcn\u00fcn do\u011fru bir \u015fekilde yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131ndan emin olmal\u0131s\u0131n\u0131z. \u00c7o\u011fu durumda, s\u00fcr\u00fcc\u00fcler otomatik olarak tan\u0131n\u0131r ancak baz\u0131 \u00f6zel durumlarda veya farkl\u0131 veri kaynaklar\u0131 kullan\u0131ld\u0131\u011f\u0131nda bu durum de\u011fi\u015febilir. Bu yap\u0131land\u0131rmalar\u0131n ard\u0131ndan, veritaban\u0131 ge\u00e7i\u015f s\u00fcrecinizi ba\u015flatmak i\u00e7in her \u015fey haz\u0131r hale gelir.<\/p>\n<pre><code>\n# Go ile kurulum (e\u011fer Go y\u00fckl\u00fcyse)\ngo install -tags 'postgres' github.com\/golang-migrate\/migrate\/v4\/cmd\/migrate@latest\n\n# \u0130kili dosya indirildikten sonra PATH'e eklenmesi (Linux\/macOS \u00f6rne\u011fi)\n# mv migrate \/usr\/local\/bin\/migrate\n\n# Kurulumu do\u011frula\nmigrate -version\n\n# Ge\u00e7i\u015f dosyalar\u0131 i\u00e7in bir dizin olu\u015ftur\nmkdir migrations\n\n# \u00d6rnek veritaban\u0131 URL'si (PostgreSQL i\u00e7in)\n# export DATABASE_URL=\"postgres:\/\/user:password@localhost:5432\/mydb?sslmode=disable\"\n# Bu URL'i migrate komutlar\u0131yla kullanacaks\u0131n\u0131z.\n<\/pre>\n<p><\/code><\/p>\n<h2>\u0130lk Ge\u00e7i\u015finizi Olu\u015fturma: Migrate ile \u015eema De\u011fi\u015fiklikleri Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>Veritaban\u0131 ge\u00e7i\u015flerini y\u00f6netmeye ba\u015flaman\u0131n en temel ad\u0131m\u0131, ilk ge\u00e7i\u015f dosyan\u0131z\u0131 olu\u015fturmakt\u0131r. <code>Migrate<\/code> arac\u0131, bu s\u00fcreci <code>migrate create<\/code> komutuyla kolayla\u015ft\u0131r\u0131r. Bu komut, belirtilen ge\u00e7i\u015f dizininde, genellikle Unix zaman damgas\u0131na veya ard\u0131\u015f\u0131k bir say\u0131ya dayal\u0131 benzersiz bir s\u00fcr\u00fcm numaras\u0131yla birlikte iki dosya olu\u015fturur: bir <code>_up.sql<\/code> dosyas\u0131 ve bir <code>_down.sql<\/code> dosyas\u0131. \u00d6rne\u011fin, <code>migrate create -ext sql -dir migrations -seq create_users_table<\/code> komutunu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, <code>migrations<\/code> dizini i\u00e7inde <code>1234567890_create_users_table.up.sql<\/code> ve <code>1234567890_create_users_table.down.sql<\/code> gibi dosyalar olu\u015facakt\u0131r (buradaki <code>1234567890<\/code> k\u0131sm\u0131 ger\u00e7ek bir zaman damgas\u0131 olacakt\u0131r). <code>up.sql<\/code> dosyas\u0131, veritaban\u0131 \u015femas\u0131n\u0131 ileriye ta\u015f\u0131yan SQL komutlar\u0131n\u0131 i\u00e7erirken, <code>down.sql<\/code> dosyas\u0131 ise yap\u0131lan de\u011fi\u015fikli\u011fi geri alan (rollback) komutlar\u0131n\u0131 i\u00e7erir. Bu ayr\u0131m, her zaman ileriye d\u00f6n\u00fck bir de\u011fi\u015fiklik i\u00e7in nas\u0131l geri al\u0131naca\u011f\u0131n\u0131 da tan\u0131mlamay\u0131 zorunlu k\u0131lar, bu da g\u00fcvenli ve y\u00f6netilebilir ge\u00e7i\u015fler i\u00e7in kritik bir uygulamad\u0131r.<\/p>\n<p>\u015eimdi bu yeni olu\u015fturulan ge\u00e7i\u015f dosyalar\u0131na bir \u00f6rnek ekleyelim. Diyelim ki uygulaman\u0131z i\u00e7in bir kullan\u0131c\u0131 tablosu olu\u015fturmak istiyorsunuz. <code>1234567890_create_users_table.up.sql<\/code> dosyas\u0131n\u0131 a\u00e7\u0131p i\u00e7ine a\u015fa\u011f\u0131daki SQL komutlar\u0131n\u0131 yazabilirsiniz:<\/p>\n<pre><code>\nCREATE TABLE users (\n    id SERIAL PRIMARY KEY,\n    username VARCHAR(50) UNIQUE NOT NULL,\n    email VARCHAR(100) UNIQUE NOT NULL,\n    password_hash VARCHAR(255) NOT NULL,\n    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,\n    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX idx_users_email ON users (email);\n<\/pre>\n<p><\/code><\/p>\n<p>Bu <code>up.sql<\/code> dosyas\u0131, <code>users<\/code> ad\u0131nda bir tablo olu\u015fturacak ve <code>email<\/code> s\u00fctununa bir indeks ekleyecektir. Ard\u0131ndan, bu de\u011fi\u015fikli\u011fi geri alabilmek i\u00e7in <code>1234567890_create_users_table.down.sql<\/code> dosyas\u0131na ilgili geri alma komutunu eklemeniz gerekir:<\/p>\n<pre><code>\nDROP TABLE IF EXISTS users;\n<\/pre>\n<p><\/code><\/p>\n<p>Bu <code>down.sql<\/code> komutu, <code>users<\/code> tablosunu silerek \u015femay\u0131 \u00f6nceki durumuna d\u00f6nd\u00fcrecektir. Ge\u00e7i\u015f dosyalar\u0131n\u0131z\u0131 haz\u0131rlad\u0131ktan sonra, <code>migrate up<\/code> komutunu kullanarak bu de\u011fi\u015fiklikleri veritaban\u0131n\u0131za uygulayabilirsiniz. Bu komut, <code>DATABASE_URL<\/code> ortam de\u011fi\u015fkeninde belirtti\u011finiz veritaban\u0131na ba\u011flanacak ve hen\u00fcz uygulanmam\u0131\u015f t\u00fcm <code>up.sql<\/code> ge\u00e7i\u015flerini s\u0131ras\u0131yla \u00e7al\u0131\u015ft\u0131racakt\u0131r. \u0130\u015flem ba\u015far\u0131yla tamamland\u0131\u011f\u0131nda, veritaban\u0131n\u0131zda <code>users<\/code> tablosu olu\u015fturulmu\u015f olacak ve <code>schema_migrations<\/code> tablosunda bu ge\u00e7i\u015fin uyguland\u0131\u011f\u0131na dair bir kay\u0131t bulunacakt\u0131r. Bu sayede, veritaban\u0131n\u0131z\u0131n hangi ge\u00e7i\u015fleri uygulad\u0131\u011f\u0131n\u0131 kolayca takip edebilirsiniz.<\/p>\n<pre><code>\n# Yeni bir ge\u00e7i\u015f dosyas\u0131 olu\u015ftur (\u00f6rnek isimle)\nmigrate create -ext sql -dir migrations -seq create_users_table\n\n# Ge\u00e7i\u015fi veritaban\u0131na uygula (DATABASE_URL ortam de\u011fi\u015fkeninin ayarl\u0131 oldu\u011funu varsayarak)\nmigrate -database $DATABASE_URL -path migrations up\n\n# Belirli bir s\u00fcr\u00fcm\u00fc kontrol et (iste\u011fe ba\u011fl\u0131)\nmigrate -database $DATABASE_URL -path migrations version\n<\/pre>\n<p><\/code><\/p>\n<blockquote><p>\n  Uzman \u0130pucu: SQL ge\u00e7i\u015f dosyalar\u0131n\u0131zda her zaman bir i\u015flem (transaction) blo\u011fu kullanmay\u0131 d\u00fc\u015f\u00fcn\u00fcn. Bu, bir ge\u00e7i\u015fin yar\u0131m kalmas\u0131 durumunda t\u00fcm de\u011fi\u015fikliklerin geri al\u0131nmas\u0131n\u0131 sa\u011flar ve veritaban\u0131n\u0131z\u0131n tutarl\u0131 kalmas\u0131na yard\u0131mc\u0131 olur. PostgreSQL'de <code>BEGIN; ... COMMIT;<\/code> veya <code>BEGIN; ... ROLLBACK;<\/code> kullan\u0131l\u0131rken, MySQL'de otomatik i\u015flem y\u00f6netimine dikkat etmek gerekebilir.\n<\/p><\/blockquote>\n<h2>Geri Al ve \u0130leri Git: Ge\u00e7i\u015fleri Y\u00f6netmenin Temel Komutlar\u0131 Nelerdir?<\/h2>\n<p><code>Migrate<\/code> ile veritaban\u0131 ge\u00e7i\u015flerini y\u00f6netirken, sadece ileriye do\u011fru de\u011fi\u015fiklik yapmak yeterli de\u011fildir. Zaman zaman bir ge\u00e7i\u015fi geri almak, belirli bir s\u00fcr\u00fcme d\u00f6nmek veya hatal\u0131 bir ge\u00e7i\u015fi d\u00fczeltmek gerekebilir. \u0130\u015fte bu senaryolar i\u00e7in <code>Migrate<\/code>'in sundu\u011fu temel komutlar devreye girer. En s\u0131k kullan\u0131lan komutlardan biri <code>migrate down<\/code>'d\u0131r. Bu komut, uygulanan en son ge\u00e7i\u015fi geri al\u0131r, yani ilgili <code>down.sql<\/code> dosyas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r. E\u011fer birden fazla ge\u00e7i\u015fi geri almak isterseniz, <code>migrate down N<\/code> (burada N geri al\u0131nacak ge\u00e7i\u015f say\u0131s\u0131d\u0131r) komutunu kullanabilirsiniz. \u00d6rne\u011fin, <code>migrate down 1<\/code> en son ge\u00e7i\u015fi geri al\u0131rken, <code>migrate down 2<\/code> son iki ge\u00e7i\u015fi geri alacakt\u0131r. Bu, \u00f6zellikle geli\u015ftirme ortam\u0131nda bir hatay\u0131 h\u0131zla d\u00fczeltmek veya bir \u00f6zelli\u011fi geli\u015ftirmeye devam ederken \u015femay\u0131 eski haline getirmek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p>Daha spesifik bir kontrol sa\u011flamak amac\u0131yla, <code>migrate goto<\/code> komutunu kullanabilirsiniz. Bu komut, veritaban\u0131n\u0131z\u0131 belirli bir ge\u00e7i\u015f s\u00fcr\u00fcm\u00fcne ta\u015f\u0131r. \u00d6rne\u011fin, <code>migrate goto 1234567890<\/code> komutu, veritaban\u0131n\u0131z\u0131 <code>1234567890<\/code> s\u00fcr\u00fcm\u00fcne getirir. E\u011fer bu s\u00fcr\u00fcmden daha yeni ge\u00e7i\u015fler uygulanm\u0131\u015fsa, <code>migrate<\/code> onlar\u0131 geri alacakt\u0131r. E\u011fer daha eski bir s\u00fcr\u00fcmse, hen\u00fcz uygulanmam\u0131\u015f ge\u00e7i\u015fleri uygulayacakt\u0131r. Bu komut, geli\u015ftirme s\u00fcrecinde belirli bir noktaya d\u00f6nmek veya farkl\u0131 bir dal \u00fczerinde \u00e7al\u0131\u015f\u0131rken veritaban\u0131 \u015femas\u0131n\u0131 e\u015fle\u015ftirmek i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r. Ancak, <code>goto<\/code> komutunu dikkatli kullanmak gerekir, \u00f6zellikle \u00fcretim ortam\u0131nda veri kayb\u0131na yol a\u00e7abilecek geri alma i\u015flemleri i\u00e7erebilece\u011fi i\u00e7in.<\/p>\n<p>Bir ba\u015fka \u00f6nemli komut ise <code>migrate force<\/code>'tur. Bazen bir ge\u00e7i\u015f i\u015flemi s\u0131ras\u0131nda bir hata meydana gelebilir ve veritaban\u0131n\u0131z \"dirty\" (kirli) bir duruma d\u00fc\u015febilir. Bu durumda <code>migrate<\/code>, daha fazla i\u015flem yapmay\u0131 reddedecektir \u00e7\u00fcnk\u00fc veritaban\u0131n\u0131n tutars\u0131z bir durumda oldu\u011funu d\u00fc\u015f\u00fcn\u00fcr. <code>migrate force N<\/code> komutu, veritaban\u0131n\u0131 belirli bir s\u00fcr\u00fcme zorlayarak bu \"dirty\" durumu \u00e7\u00f6zmenizi sa\u011flar. Genellikle, bu komutu kullanmadan \u00f6nce veritaban\u0131ndaki sorunu manuel olarak incelemek ve gerekirse d\u00fczeltmek en iyi yakla\u015f\u0131md\u0131r. Son olarak, <code>migrate version<\/code> komutu, o anki veritaban\u0131n\u0131z\u0131n hangi ge\u00e7i\u015f s\u00fcr\u00fcm\u00fcnde oldu\u011funu ve uygulanmay\u0131 bekleyen ge\u00e7i\u015flerin olup olmad\u0131\u011f\u0131n\u0131 g\u00f6sterir. Bu komut, veritaban\u0131n\u0131z\u0131n \u015fema durumunu h\u0131zl\u0131ca kontrol etmek ve herhangi bir tutars\u0131zl\u0131\u011f\u0131 tespit etmek i\u00e7in idealdir. Bu komutlar\u0131 etkili bir \u015fekilde kullanarak, <code>Migrate<\/code> ile veritaban\u0131 ge\u00e7i\u015flerinizi g\u00fcvenli ve kontroll\u00fc bir \u015fekilde y\u00f6netebilirsiniz.<\/p>\n<table>\n<thead>\n<tr>\n<th>Komut<\/th>\n<th>A\u00e7\u0131klama<\/th>\n<th>\u00d6rnek Kullan\u0131m<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>up<\/code><\/td>\n<td>Uygulanmam\u0131\u015f t\u00fcm ge\u00e7i\u015fleri ileriye uygular.<\/td>\n<td><code>migrate -database $DATABASE_URL -path migrations up<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>down<\/code><\/td>\n<td>Son uygulanan ge\u00e7i\u015fi geri al\u0131r. Belirtilen say\u0131 kadar geri alabilir.<\/td>\n<td><code>migrate -database $DATABASE_URL -path migrations down 1<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>goto<\/code><\/td>\n<td>Veritaban\u0131n\u0131 belirtilen s\u00fcr\u00fcm numaras\u0131na getirir (ileri veya geri).<\/td>\n<td><code>migrate -database $DATABASE_URL -path migrations goto 1678886400<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>force<\/code><\/td>\n<td>Veritaban\u0131n\u0131 kirli bir durumdan kurtarmak i\u00e7in s\u00fcr\u00fcm numaras\u0131n\u0131 zorlar.<\/td>\n<td><code>migrate -database $DATABASE_URL -path migrations force 1678886400<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>version<\/code><\/td>\n<td>Mevcut veritaban\u0131 s\u00fcr\u00fcm\u00fcn\u00fc ve kirli olup olmad\u0131\u011f\u0131n\u0131 g\u00f6sterir.<\/td>\n<td><code>migrate -database $DATABASE_URL -path migrations version<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131: Migrate ile Karma\u015f\u0131k Ge\u00e7i\u015fler Nas\u0131l Y\u00f6netilir?<\/h2>\n<p>Veritaban\u0131 \u015femas\u0131 de\u011fi\u015fiklikleri her zaman basit tablo ekleme veya s\u00fctun silme i\u015flemleriyle s\u0131n\u0131rl\u0131 kalmaz. Ger\u00e7ek d\u00fcnya senaryolar\u0131nda, mevcut verileri d\u00f6n\u00fc\u015ft\u00fcrmemiz, tablolar\u0131 birle\u015ftirmemiz veya b\u00f6lmemiz, karma\u015f\u0131k indeksler eklememiz ve hatta veritaban\u0131 \u00f6zelliklerini de\u011fi\u015ftirmemiz gerekebilir. <code>Migrate<\/code> arac\u0131, bu t\u00fcr karma\u015f\u0131k durumlar\u0131 y\u00f6netmek i\u00e7in gereken esnekli\u011fi sunar. \u00d6rne\u011fin, bir e-ticaret platformunda kullan\u0131c\u0131 tablosuna yeni bir s\u00fctun eklemeniz gerekti\u011fini d\u00fc\u015f\u00fcnelim. Ba\u015flang\u0131\u00e7ta sadece kullan\u0131c\u0131 ad\u0131 ve e-posta tutarken, art\u0131k kullan\u0131c\u0131n\u0131n g\u00f6nderim adresini de saklaman\u0131z gerekiyor. Bu durumda, <code>create_shipping_address_column_to_users_table<\/code> ad\u0131nda yeni bir ge\u00e7i\u015f olu\u015ftururuz. <code>up.sql<\/code> dosyas\u0131nda, <code>users<\/code> tablosuna <code>shipping_address<\/code> ad\u0131nda bir <code>TEXT<\/code> s\u00fctunu ekleriz. E\u011fer bu s\u00fctun <code>NOT NULL<\/code> olacaksa, mevcut kay\u0131tlar i\u00e7in bir varsay\u0131lan de\u011fer sa\u011flamak veya verileri doldurmak i\u00e7in ek ad\u0131mlar atmak \u00f6nemlidir, aksi takdirde ge\u00e7i\u015f ba\u015far\u0131s\u0131z olabilir. \u00d6rne\u011fin, \u00f6nce <code>NULL<\/code> de\u011ferine izin veren bir s\u00fctun ekleyip, ard\u0131ndan mevcut verileri doldurup, son olarak <code>NOT NULL<\/code> k\u0131s\u0131tlamas\u0131n\u0131 eklemek daha g\u00fcvenli bir yakla\u015f\u0131md\u0131r.<\/p>\n<pre><code>\n-- 1234567891_add_shipping_address_to_users.up.sql\nALTER TABLE users ADD COLUMN shipping_address TEXT;\n-- E\u011fer s\u00fctun NOT NULL olmal\u0131ysa, mevcut verileri g\u00fcncellemeniz gerekebilir:\n-- UPDATE users SET shipping_address = '' WHERE shipping_address IS NULL;\n-- ALTER TABLE users ALTER COLUMN shipping_address SET NOT NULL;\n<\/pre>\n<p><\/code><\/p>\n<p>Bu ge\u00e7i\u015fin <code>down.sql<\/code> dosyas\u0131 ise sadece ekledi\u011fimiz s\u00fctunu silmelidir:<\/p>\n<pre><code>\n-- 1234567891_add_shipping_address_to_users.down.sql\nALTER TABLE users DROP COLUMN shipping_address;\n<\/pre>\n<p><\/code><\/p>\n<p>Bir ba\u015fka karma\u015f\u0131k senaryo, mevcut bir tablonun ad\u0131n\u0131 de\u011fi\u015ftirmektir. \u00d6rne\u011fin, <code>products<\/code> tablonuzun ad\u0131n\u0131 <code>inventory_items<\/code> olarak de\u011fi\u015ftirmek istiyorsunuz. Bu, sadece <code>RENAME TABLE<\/code> komutuyla yap\u0131labilir, ancak bu komutun veritaban\u0131 tetikleyicileri, indeksler veya foreign key k\u0131s\u0131tlamalar\u0131 \u00fczerindeki etkisini g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir. <code>Migrate<\/code> ile bu t\u00fcr de\u011fi\u015fiklikleri de kolayca y\u00f6netebilirsiniz. <code>RENAME TABLE<\/code> komutunu <code>up.sql<\/code>'e, tablonun ad\u0131n\u0131 orijinal haline d\u00f6nd\u00fcren komutu ise <code>down.sql<\/code>'e eklersiniz. Veri d\u00f6n\u00fc\u015ft\u00fcrme gerektiren senaryolarda ise, <code>up.sql<\/code> i\u00e7inde <code>UPDATE<\/code> veya <code>INSERT<\/code> komutlar\u0131 kullanarak mevcut verileri yeni \u015femaya uygun hale getirebilirsiniz. Bu t\u00fcr veri odakl\u0131 ge\u00e7i\u015flerde, i\u015flemin geri al\u0131nabilirli\u011fini sa\u011flamak i\u00e7in <code>down.sql<\/code> i\u00e7inde verileri eski haline getirecek mant\u0131\u011f\u0131 dikkatlice kurgulamak veya veri kayb\u0131 riskini kabul etmek gerekebilir. Unutulmamal\u0131d\u0131r ki, <code>Migrate<\/code> bir \u015fema ge\u00e7i\u015f arac\u0131d\u0131r, ancak SQL betikleri arac\u0131l\u0131\u011f\u0131yla veri ge\u00e7i\u015flerini de etkili bir \u015fekilde y\u00f6netmeye olanak tan\u0131r. T\u00fcm bu senaryolarda, ge\u00e7i\u015fleri dikkatli bir \u015fekilde test etmek, olas\u0131 hatalar\u0131 \u00f6nlemek ve veritaban\u0131n\u0131z\u0131n b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc korumak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h2>Otomasyon ve S\u00fcrekli Entegrasyon: CI\/CD Ortam\u0131nda Migrate Nas\u0131l Kullan\u0131l\u0131r?<\/h2>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme pratiklerinin merkezinde S\u00fcrekli Entegrasyon (CI) ve S\u00fcrekli Da\u011f\u0131t\u0131m (CD) s\u00fcre\u00e7leri yer al\u0131r. <code>Migrate<\/code> gibi bir veritaban\u0131 ge\u00e7i\u015f arac\u0131, CI\/CD boru hatlar\u0131na sorunsuz bir \u015fekilde entegre edilebilir ve bu s\u00fcre\u00e7lerin otomasyonunda hayati bir rol oynar. Bir CI\/CD ortam\u0131nda <code>migrate<\/code> kullanman\u0131n temel amac\u0131, her kod da\u011f\u0131t\u0131m\u0131nda veya entegrasyonunda veritaban\u0131 \u015femas\u0131n\u0131n uygulaman\u0131n bekledi\u011fi duruma getirildi\u011finden emin olmakt\u0131r. Bu, otomatik testlerin tutarl\u0131 bir veritaban\u0131 \u015femas\u0131 \u00fczerinde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar ve canl\u0131 ortama da\u011f\u0131t\u0131m yap\u0131ld\u0131\u011f\u0131nda veritaban\u0131 uyumsuzluklar\u0131ndan kaynaklanan hatalar\u0131 minimize eder.<\/p>\n<p>Tipik bir CI\/CD boru hatt\u0131nda, <code>migrate<\/code> arac\u0131n\u0131 a\u015fa\u011f\u0131daki ad\u0131mlarda kullanabilirsiniz:<\/p>\n<p>1.  <strong>Test Ortam\u0131 Kurulumu<\/strong>: Her yeni kod g\u00f6nderimi (push) veya \u00e7ekme iste\u011fi (pull request) i\u00e7in, CI sunucusu genellikle ge\u00e7ici bir test veritaban\u0131 olu\u015fturur. Bu veritaban\u0131 bo\u015f olur ve uygulaman\u0131n testlerini \u00e7al\u0131\u015ft\u0131rabilmesi i\u00e7in en g\u00fcncel \u015femaya sahip olmas\u0131 gerekir. CI betiklerinizde, bu bo\u015f veritaban\u0131na ba\u011flanacak \u015fekilde <code>DATABASE_URL<\/code> ortam de\u011fi\u015fkenini ayarlad\u0131ktan sonra, <code>migrate -database $DATABASE_URL -path migrations up<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131rs\u0131n\u0131z. Bu, test ortam\u0131ndaki veritaban\u0131n\u0131 en g\u00fcncel s\u00fcr\u00fcme y\u00fckseltir.<br \/>\n2.  <strong>Test \u00c7al\u0131\u015ft\u0131rma<\/strong>: Veritaban\u0131 \u015femas\u0131 g\u00fcncelledikten sonra, uygulaman\u0131n birim, entegrasyon ve u\u00e7tan uca testleri \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. Bu testler, yeni veritaban\u0131 \u015femas\u0131n\u0131n uygulama ile uyumlu oldu\u011funu do\u011frular.<br \/>\n3.  <strong>Da\u011f\u0131t\u0131m A\u015famas\u0131 (Staging\/Production)<\/strong>: E\u011fer t\u00fcm testler ba\u015far\u0131yla ge\u00e7erse, kod bir sonraki ortama (\u00f6rne\u011fin, staging veya production) da\u011f\u0131t\u0131lmaya haz\u0131r hale gelir. Da\u011f\u0131t\u0131m s\u00fcrecinin bir par\u00e7as\u0131 olarak, uygulama ba\u015flamadan \u00f6nce veya uygulama da\u011f\u0131t\u0131m\u0131n\u0131n hemen ard\u0131ndan, hedef ortamdaki veritaban\u0131na <code>migrate up<\/code> komutu uygulan\u0131r. Bu, canl\u0131 veritaban\u0131n\u0131n \u015femas\u0131n\u0131 uygulaman\u0131n yeni s\u00fcr\u00fcm\u00fcne uygun hale getirir.<\/p>\n<pre><code>\n# \u00d6rnek bir GitHub Actions CI\/CD ad\u0131m\u0131\nname: Veritaban\u0131 Ge\u00e7i\u015fleri ve Testler\n\non: [push]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions\/checkout@v2\n\n    - name: Migrate arac\u0131n\u0131 kur\n      run: |\n        curl -L https:\/\/github.com\/golang-migrate\/migrate\/releases\/download\/v4.16.2\/migrate.linux-amd64.tar.gz | tar xvz\n        sudo mv migrate \/usr\/local\/bin\/\n\n    - name: PostgreSQL hizmetini ba\u015flat\n      run: |\n        sudo systemctl start postgresql\n        sudo -u postgres psql -c \"CREATE DATABASE test_db;\"\n        sudo -u postgres psql -c \"CREATE USER test_user WITH PASSWORD 'test_password';\"\n        sudo -u postgres psql -c \"GRANT ALL PRIVILEGES ON DATABASE test_db TO test_user;\"\n      \n    - name: Ge\u00e7i\u015fleri Uygula\n      env:\n        DATABASE_URL: postgres:\/\/test_user:test_password@localhost:5432\/test_db?sslmode=disable\n      run: |\n        migrate -database \"$DATABASE_URL\" -path migrations up\n\n    - name: Uygulama Testlerini \u00c7al\u0131\u015ft\u0131r (\u00f6rnek)\n      run: |\n        echo \"Uygulama testleri burada \u00e7al\u0131\u015ft\u0131r\u0131lacak...\"\n        # go test .\/...\n<\/pre>\n<p><\/code><\/p>\n<blockquote><p>\n  Uzman \u0130pucu: CI\/CD ortam\u0131nda <code>migrate<\/code> kullan\u0131rken, yetkilendirme ve eri\u015fim kontrollerine \u00f6zel dikkat g\u00f6sterin. Veritaban\u0131 ba\u011flant\u0131 bilgilerini g\u00fcvenli bir \u015fekilde (\u00f6rne\u011fin, \u015fifrelenmi\u015f ortam de\u011fi\u015fkenleri veya s\u0131r y\u00f6neticileri arac\u0131l\u0131\u011f\u0131yla) y\u00f6netti\u011finizden emin olun. Ayr\u0131ca, <code>migrate<\/code> komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131ran kullan\u0131c\u0131n\u0131n sadece ge\u00e7i\u015fleri uygulamak i\u00e7in gerekli minimum yetkilere sahip olmas\u0131 g\u00fcvenlik a\u00e7\u0131s\u0131ndan kritik bir yakla\u015f\u0131md\u0131r.\n<\/p><\/blockquote>\n<p>\u00c7oklu da\u011f\u0131t\u0131ml\u0131 veya paralel da\u011f\u0131t\u0131ml\u0131 sistemlerde, ayn\u0131 anda birden fazla uygulaman\u0131n da\u011f\u0131t\u0131ld\u0131\u011f\u0131 durumlarda ge\u00e7i\u015flerin y\u00f6netimi biraz daha karma\u015f\u0131k hale gelebilir. Bu senaryolarda, <code>migrate<\/code> arac\u0131n\u0131n atomik ge\u00e7i\u015f uygulamalar\u0131 (her bir ge\u00e7i\u015f bir i\u015flem i\u00e7inde ger\u00e7ekle\u015fir) ve <code>schema_migrations<\/code> tablosu sayesinde \u00e7o\u011fu zaman sorun ya\u015fanmaz. Ancak yine de, bir veritaban\u0131 kilitleme mekanizmas\u0131 veya uygulaman\u0131n sadece tek bir \u00f6rne\u011finin ge\u00e7i\u015fleri \u00e7al\u0131\u015ft\u0131rmas\u0131n\u0131 sa\u011flayacak bir d\u00fczenek kurmak, \u00f6zellikle b\u00fcy\u00fck ve kritik sistemlerde ek g\u00fcvenlik sa\u011flayabilir. CI\/CD boru hatt\u0131na entegrasyon, geli\u015ftiricilerin veritaban\u0131 de\u011fi\u015fiklikleri konusunda daha az endi\u015felenmesini sa\u011flayarak, h\u0131z ve g\u00fcvenilirli\u011fi art\u0131r\u0131r.<\/p>\n<h2>\u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar: Migrate Kullan\u0131m\u0131nda Nelere Dikkat Etmelisiniz?<\/h2>\n<p><code>Migrate<\/code> arac\u0131 g\u00fc\u00e7l\u00fc bir yard\u0131mc\u0131 olsa da, en iyi pratikleri uygulamak, veritaban\u0131 ge\u00e7i\u015flerinizi daha da g\u00fcvenli ve y\u00f6netilebilir hale getirir. \u0130lk olarak, <strong>ge\u00e7i\u015f dosyalar\u0131n\u0131n isimlendirilmesi<\/strong> kritik \u00f6neme sahiptir. <code>Migrate<\/code>, varsay\u0131lan olarak zaman damgas\u0131 tabanl\u0131 s\u0131ralama kullan\u0131r, bu da kronolojik d\u00fczeni garanti eder. Ancak, ge\u00e7i\u015flerin amac\u0131n\u0131 a\u00e7\u0131k\u00e7a belirten anlaml\u0131 isimler kullanmak (\u00f6rne\u011fin, <code>1678886400_create_users_table.up.sql<\/code>) daha sonra hangi ge\u00e7i\u015fin ne yapt\u0131\u011f\u0131n\u0131 anlamay\u0131 kolayla\u015ft\u0131r\u0131r. \u0130kinci olarak, <strong>her zaman bir <code>down.sql<\/code> dosyas\u0131 sa\u011flay\u0131n<\/strong>. Geri alma (rollback) yetene\u011fi, hem geli\u015ftirme hem de \u00fcretim ortamlar\u0131nda hatalar\u0131 d\u00fczeltmek veya eski bir s\u00fcr\u00fcme d\u00f6nmek i\u00e7in hayati \u00f6neme sahiptir. Eksik bir <code>down.sql<\/code> dosyas\u0131, beklenmedik durumlarda sizi \u00e7aresiz b\u0131rakabilir.<\/p>\n<p><strong>Ge\u00e7i\u015fleri test etmek<\/strong>, g\u00f6z ard\u0131 edilmemesi gereken bir ba\u015fka en iyi uygulamad\u0131r. Her ge\u00e7i\u015fi bir test ortam\u0131nda, bo\u015f bir veritaban\u0131 \u00fczerinde hem <code>up<\/code> hem de <code>down<\/code> komutlar\u0131yla \u00e7al\u0131\u015ft\u0131rmak, olas\u0131 hatalar\u0131 veya unutulmu\u015f senaryolar\u0131 da\u011f\u0131t\u0131mdan \u00f6nce tespit etmenizi sa\u011flar. Entegrasyon testlerinizde, ge\u00e7i\u015flerinizi otomatik olarak \u00e7al\u0131\u015ft\u0131rmak bu s\u00fcreci otomatize etmenin harika bir yoludur. Ayr\u0131ca, b\u00fcy\u00fck veya potansiyel olarak y\u0131k\u0131c\u0131 ge\u00e7i\u015fler i\u00e7in <strong>\u00f6nce \u00fcretim veritaban\u0131n\u0131n bir yede\u011fini almak<\/strong> her zaman tavsiye edilir. Bir hata durumunda geri d\u00f6necek bir noktan\u0131z\u0131n olmas\u0131, b\u00fcy\u00fck veri kay\u0131plar\u0131n\u0131 \u00f6nler.<\/p>\n<p>Veri ge\u00e7i\u015fleri (data migrations) yaparken, yani \u015fema de\u011fi\u015fiklikleriyle birlikte mevcut veriler \u00fczerinde manip\u00fclasyonlar (g\u00fcncelleme, ta\u015f\u0131ma vb.) yaparken dikkatli olun. Bu t\u00fcr i\u015flemler geri al\u0131namaz olabilir ve <code>down.sql<\/code> dosyan\u0131zda verileri orijinal haline d\u00f6nd\u00fcrmek her zaman m\u00fcmk\u00fcn olmayabilir. Bu gibi durumlarda, veri ge\u00e7i\u015flerini ayr\u0131 bir ge\u00e7i\u015f olarak ele almak veya \u00e7ok kademeli bir yakla\u015f\u0131m benimsemek (\u00f6rne\u011fin, \u00f6nce yeni s\u00fctunu ekle, sonra verileri ta\u015f\u0131, sonra eski s\u00fctunu sil) daha g\u00fcvenli olabilir. Son olarak, <strong>veritaban\u0131 s\u00fcr\u00fcmlerini takip etmek<\/strong> i\u00e7in <code>migrate version<\/code> komutunu d\u00fczenli olarak kullan\u0131n. Bu, farkl\u0131 ortamlar aras\u0131ndaki tutars\u0131zl\u0131klar\u0131 erken a\u015famada tespit etmenize ve gidermenize yard\u0131mc\u0131 olur. Bu ipu\u00e7lar\u0131 ve en iyi uygulamalar, <code>Migrate<\/code> ile veritaban\u0131 ge\u00e7i\u015flerinizi daha sa\u011flam, g\u00fcvenilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirmenize yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h2>Sonu\u00e7: Veritaban\u0131 Ge\u00e7i\u015flerinde Migrate'in G\u00fcc\u00fc Nerede Yatar?<\/h2>\n<p>Veritaban\u0131 ge\u00e7i\u015fleri, modern yaz\u0131l\u0131m geli\u015ftirmenin ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r ve <code>Migrate<\/code> arac\u0131, bu karma\u015f\u0131k s\u00fcreci basitle\u015ftiren, otomatikle\u015ftiren ve g\u00fcvenilir hale getiren g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sunar. Bu makale boyunca, <code>Migrate<\/code>'in ne oldu\u011funu, neden bu kadar \u00f6nemli oldu\u011funu ve veritaban\u0131 \u015feman\u0131zdaki de\u011fi\u015fiklikleri nas\u0131l etkili bir \u015fekilde y\u00f6netebilece\u011finizi ad\u0131m ad\u0131m inceledik. Kurulumdan ilk ge\u00e7i\u015finizi olu\u015fturmaya, temel komutlardan karma\u015f\u0131k senaryolar\u0131 ele almaya ve CI\/CD s\u00fcre\u00e7lerine entegrasyona kadar bir\u00e7ok konuya de\u011findik. <code>Migrate<\/code>'in a\u00e7\u0131k kaynak yap\u0131s\u0131, \u00e7oklu veritaban\u0131 deste\u011fi ve basit CLI aray\u00fcz\u00fc sayesinde, geli\u015ftiriciler veritaban\u0131 \u015fema y\u00f6netimini g\u00fcvenle ele alabilirler.<\/p>\n<p>Anahtar kelimelerle \u00f6zetlemek gerekirse, <code>Migrate<\/code> ile <strong>veritaban\u0131 \u015fema y\u00f6netimi<\/strong>ni kolayla\u015ft\u0131r\u0131r, <strong>s\u00fcr\u00fcm kontrol\u00fc<\/strong>n\u00fc sa\u011flar ve <strong>da\u011f\u0131t\u0131m s\u00fcre\u00e7leri<\/strong>nizi h\u0131zland\u0131r\u0131rs\u0131n\u0131z. Hatalar\u0131 azalt\u0131r, ekip \u00fcyeleri aras\u0131nda tutarl\u0131l\u0131\u011f\u0131 art\u0131r\u0131r ve projenizin uzun vadeli sa\u011fl\u0131\u011f\u0131 i\u00e7in sa\u011flam bir temel olu\u015fturur. \u0130ster k\u00fc\u00e7\u00fck bir proje isterse b\u00fcy\u00fck \u00f6l\u00e7ekli bir kurumsal uygulama geli\u015ftiriyor olun, <code>Migrate<\/code> veritaban\u0131 ge\u00e7i\u015flerinizi profesyonel bir \u015fekilde y\u00f6netmek i\u00e7in ihtiyac\u0131n\u0131z olan ara\u00e7lar\u0131 sunar. Unutmay\u0131n, iyi y\u00f6netilen veritaban\u0131 ge\u00e7i\u015fleri, ba\u015far\u0131l\u0131 bir uygulaman\u0131n temel ta\u015flar\u0131ndan biridir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. Migrate arac\u0131n\u0131 hangi veritabanlar\u0131 ile kullanabilirim?<\/strong><br \/>\nMigrate, PostgreSQL, MySQL, SQLite3, SQL Server, Oracle, CockroachDB gibi bir\u00e7ok pop\u00fcler veritaban\u0131n\u0131 destekler. Desteklenen veritabanlar\u0131n\u0131n tam listesi i\u00e7in Migrate'in GitHub sayfas\u0131na bakabilirsiniz.<\/p>\n<p><strong>2. Bir ge\u00e7i\u015fi uygularken hata olu\u015fursa ne yapmal\u0131y\u0131m?<\/strong><br \/>\nE\u011fer bir ge\u00e7i\u015f s\u0131ras\u0131nda hata olu\u015fursa, veritaban\u0131n\u0131z \"dirty\" (kirli) bir duruma d\u00fc\u015febilir. Bu durumda <code>migrate<\/code> daha fazla i\u015flem yapmay\u0131 reddeder. \u00d6ncelikle hatan\u0131n nedenini tespit edip d\u00fczeltmeniz, ard\u0131ndan <code>migrate force N<\/code> komutu ile veritaban\u0131n\u0131 hatan\u0131n olu\u015ftu\u011fu s\u00fcr\u00fcm numaras\u0131na \"temiz\" olarak i\u015faretlemeniz gerekebilir. Manuel olarak veritaban\u0131 durumunu kontrol etmek ve d\u00fczeltmek genellikle iyi bir yakla\u015f\u0131md\u0131r.<\/p>\n<p><strong>3. Migrate ile veri ge\u00e7i\u015fi yapabilir miyim?<\/strong><br \/>\nEvet, <code>Migrate<\/code> temelde bir \u015fema ge\u00e7i\u015f arac\u0131 olsa da, <code>up.sql<\/code> ve <code>down.sql<\/code> dosyalar\u0131 i\u00e7inde standart SQL komutlar\u0131n\u0131 kullanarak veri d\u00f6n\u00fc\u015ft\u00fcrme ve ta\u015f\u0131ma i\u015flemleri de yapabilirsiniz. Ancak, veri ge\u00e7i\u015flerinin geri al\u0131nabilirli\u011fi \u015fema ge\u00e7i\u015flerine g\u00f6re daha zor olabilir, bu y\u00fczden dikkatli planlama ve yedekleme \u00f6nemlidir.<\/p>\n<p><strong>4. Ge\u00e7i\u015f dosyalar\u0131n\u0131 nas\u0131l adland\u0131rmal\u0131y\u0131m?<\/strong><br \/>\n<code>Migrate<\/code>, <code>create<\/code> komutuyla otomatik olarak zaman damgas\u0131 tabanl\u0131 s\u00fcr\u00fcm numaralar\u0131 olu\u015fturur. Bu numaralar\u0131n arkas\u0131na ge\u00e7i\u015fin amac\u0131n\u0131 a\u00e7\u0131klayan k\u0131sa ve anlaml\u0131 bir metin eklemek (\u00f6rn. <code>1678886400_add_email_index_to_users_table.up.sql<\/code>), ge\u00e7i\u015flerin ne i\u015fe yarad\u0131\u011f\u0131n\u0131 anlamay\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<p><strong>5. Migrate arac\u0131 ile Go kodu kullanarak ge\u00e7i\u015f yazabilir miyim?<\/strong><br \/>\nEvet, <code>Migrate<\/code> sadece SQL dosyalar\u0131n\u0131 de\u011fil, ayn\u0131 zamanda Go dili ile yaz\u0131lm\u0131\u015f ge\u00e7i\u015f betiklerini de destekler. Bu, \u00f6zellikle karma\u015f\u0131k mant\u0131k gerektiren veya veritaban\u0131 s\u00fcr\u00fcc\u00fcs\u00fcn\u00fcn \u00f6zel \u00f6zelliklerini kullanmak istedi\u011finiz durumlarda kullan\u0131\u015fl\u0131 olabilir. Go ge\u00e7i\u015fleri i\u00e7in <code>--ext go<\/code> parametresi ile <code>create<\/code> komutunu kullanabilirsiniz.<\/p>\n","protected":false},"excerpt":{"rendered":"Veritaban\u0131 Ge\u00e7i\u015fleri: Migrate ile Sorunsuz Y\u00f6netim Veritaban\u0131 \u015feman\u0131z\u0131 projelerinizde sorunsuz bir \u015fekilde y\u00f6netmek mi istiyorsunuz? Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e veritaban\u0131&hellip;","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":[1],"tags":[],"class_list":{"0":"post-36036","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","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>Giri\u015f: Veritaban\u0131 Ge\u00e7i\u015fleri Neden Kritik Bir \u00d6neme Sahip?<\/title>\n<meta name=\"description\" content=\"Hi\u00e7bir etiketi bulunamad\u0131.\" \/>\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\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Giri\u015f: Veritaban\u0131 Ge\u00e7i\u015fleri Neden Kritik Bir \u00d6neme Sahip?\" \/>\n<meta property=\"og:description\" content=\"Hi\u00e7bir etiketi bulunamad\u0131.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-07T01:30:53+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=\"24 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Giri\u015f: Veritaban\u0131 Ge\u00e7i\u015fleri Neden Kritik Bir \u00d6neme Sahip?\",\"datePublished\":\"2025-12-07T01:30:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/\"},\"wordCount\":4129,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/\",\"name\":\"Giri\u015f: Veritaban\u0131 Ge\u00e7i\u015fleri Neden Kritik Bir \u00d6neme Sahip?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-07T01:30:53+00:00\",\"description\":\"Hi\u00e7bir etiketi bulunamad\u0131.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Giri\u015f: Veritaban\u0131 Ge\u00e7i\u015fleri Neden Kritik Bir \u00d6neme Sahip?\"}]},{\"@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":"Giri\u015f: Veritaban\u0131 Ge\u00e7i\u015fleri Neden Kritik Bir \u00d6neme Sahip?","description":"Hi\u00e7bir etiketi bulunamad\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\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/","og_locale":"tr_TR","og_type":"article","og_title":"Giri\u015f: Veritaban\u0131 Ge\u00e7i\u015fleri Neden Kritik Bir \u00d6neme Sahip?","og_description":"Hi\u00e7bir etiketi bulunamad\u0131.","og_url":"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-07T01:30:53+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"24 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Giri\u015f: Veritaban\u0131 Ge\u00e7i\u015fleri Neden Kritik Bir \u00d6neme Sahip?","datePublished":"2025-12-07T01:30:53+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/"},"wordCount":4129,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/","url":"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/","name":"Giri\u015f: Veritaban\u0131 Ge\u00e7i\u015fleri Neden Kritik Bir \u00d6neme Sahip?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-07T01:30:53+00:00","description":"Hi\u00e7bir etiketi bulunamad\u0131.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/giris-veritabani-gecisleri-neden-kritik-bir-oneme-sahip\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Giri\u015f: Veritaban\u0131 Ge\u00e7i\u015fleri Neden Kritik Bir \u00d6neme Sahip?"}]},{"@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\/36036","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=36036"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36036\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36036"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36036"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36036"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}