{"id":42367,"date":"2026-06-07T21:08:00","date_gmt":"2026-06-07T18:08:00","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/"},"modified":"2026-06-07T21:08:00","modified_gmt":"2026-06-07T18:08:00","slug":"ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/","title":{"rendered":"Ham SQL Sorgular\u0131ndan T\u00fcr G\u00fcvenli\u011fine: Prisma ORM ile Tan\u0131\u015fma Hikayem"},"content":{"rendered":"<h2>Ham SQL Sorgular\u0131ndan T\u00fcr G\u00fcvenli\u011fine: Prisma ORM ile Tan\u0131\u015fma Hikayem<\/h2>\n<p>Modern web uygulamalar\u0131 geli\u015ftirirken veritaban\u0131 etkile\u015fimi, \u00e7o\u011fu zaman geli\u015ftiricilerin kar\u015f\u0131la\u015ft\u0131\u011f\u0131 en karma\u015f\u0131k ve hata potansiyeli y\u00fcksek alanlardan biri olmu\u015ftur. \u00d6zellikle b\u00fcy\u00fck ve h\u0131zla b\u00fcy\u00fcyen projelerde, ham SQL sorgular\u0131 yazmak, hem g\u00fcvenlik a\u00e7\u0131klar\u0131 hem de bak\u0131m zorluklar\u0131 a\u00e7\u0131s\u0131ndan ciddi riskler bar\u0131nd\u0131r\u0131r. Peki, bu karma\u015f\u0131k SQL d\u00fcnyas\u0131ndan s\u0131yr\u0131l\u0131p, daha g\u00fcvenli, daha h\u0131zl\u0131 ve daha tip-g\u00fcvenli bir veritaban\u0131 deneyimine nas\u0131l ge\u00e7i\u015f yapabiliriz? \u0130\u015fte bu noktada, Object-Relational Mapping (ORM) ara\u00e7lar\u0131, \u00f6zellikle de Prisma ORM, geli\u015ftiricilerin imdad\u0131na yeti\u015fiyor ve veritaban\u0131 etkile\u015fimini k\u00f6kten de\u011fi\u015ftiriyor. Bu makalede, ham SQL sorgular\u0131n\u0131n getirdi\u011fi zorluklardan ba\u015flayarak, Prisma ORM&#8217;in sundu\u011fu \u00e7\u00f6z\u00fcmleri, ad\u0131m ad\u0131m kurulumunu, kullan\u0131m\u0131n\u0131 ve projelerinize nas\u0131l de\u011fer katabilece\u011fini detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h2>Neden Ham SQL Sorgular\u0131 Geli\u015ftiricilerin Kabusu Haline Gelebilir?<\/h2>\n<p>Veritaban\u0131, bir uygulaman\u0131n kalbidir ve do\u011fru veri y\u00f6netimi, uygulaman\u0131n performans\u0131 ve g\u00fcvenli\u011fi i\u00e7in hayati \u00f6nem ta\u015f\u0131r. Ancak, veritaban\u0131yla etkile\u015fim kurman\u0131n en temel yolu olan ham SQL sorgular\u0131 yazmak, zamanla geli\u015ftiriciler i\u00e7in bir dizi zorlu\u011fu beraberinde getirir. \u0130lk ba\u015fta basit g\u00f6r\u00fcnen sorgular, uygulaman\u0131n b\u00fcy\u00fcmesiyle birlikte karma\u015f\u0131kla\u015f\u0131r ve y\u00f6netilmesi g\u00fc\u00e7 bir hal al\u0131r.<\/p>\n<p>\u00d6ncelikle, <strong>SQL enjeksiyonu<\/strong> riski, ham SQL kullan\u0131m\u0131n\u0131n en b\u00fcy\u00fck g\u00fcvenlik a\u00e7\u0131klar\u0131ndan biridir. Kullan\u0131c\u0131 girdilerini do\u011frudan SQL sorgular\u0131na dahil etmek, k\u00f6t\u00fc niyetli ki\u015filerin veritaban\u0131na yetkisiz eri\u015fim sa\u011flamas\u0131na veya hassas verileri \u00e7almas\u0131na olanak tan\u0131r. Bu t\u00fcr sald\u0131r\u0131lar, bir uygulaman\u0131n itibar\u0131n\u0131 ve kullan\u0131c\u0131 g\u00fcvenini ciddi \u015fekilde zedeler. Parametreli sorgular kullanmak bu riski azaltabilse de, her zaman do\u011fru \u015fekilde uygulanmayabilir ve insan hatas\u0131na a\u00e7\u0131kt\u0131r.<\/p>\n<p>\u0130kinci olarak, <strong>s\u00f6zdizimi hatalar\u0131 ve manuel veri e\u015fleme<\/strong>, geli\u015ftirme s\u00fcrecini yava\u015flat\u0131r. Ham SQL sorgular\u0131nda k\u00fc\u00e7\u00fck bir yaz\u0131m hatas\u0131 bile t\u00fcm sorgunun ba\u015far\u0131s\u0131z olmas\u0131na neden olabilir. Ayr\u0131ca, veritaban\u0131ndan d\u00f6nen verilerin uygulama taraf\u0131ndaki nesnelere (object) d\u00f6n\u00fc\u015ft\u00fcr\u00fclmesi (manuel veri e\u015fleme), tekrarlayan ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7tir. \u00d6rne\u011fin, bir veritaban\u0131 tablosundaki <code>kullanici_adi<\/code> s\u00fctununu uygulaman\u0131zda <code>userName<\/code> \u00f6zelli\u011fine e\u015flemek, her sorguda manuel olarak yap\u0131lmas\u0131 gereken bir i\u015flemdir. Bu durum, \u00f6zellikle b\u00fcy\u00fck veri k\u00fcmeleri ve karma\u015f\u0131k veri yap\u0131lar\u0131yla u\u011fra\u015f\u0131rken zaman al\u0131c\u0131 ve yorucu hale gelir.<\/p>\n<p>\u00dc\u00e7\u00fcnc\u00fc olarak, <strong>bak\u0131m zorlu\u011fu ve kod tekrar\u0131<\/strong>, projeler b\u00fcy\u00fcd\u00fck\u00e7e ka\u00e7\u0131n\u0131lmaz hale gelir. Ayn\u0131 veya benzer sorgular\u0131 uygulaman\u0131n farkl\u0131 yerlerinde tekrar tekrar yazmak, kod tekrar\u0131na yol a\u00e7ar. Veritaban\u0131 \u015femas\u0131nda yap\u0131lan k\u00fc\u00e7\u00fck bir de\u011fi\u015fiklik, bu sorgular\u0131n tamam\u0131n\u0131n g\u00fcncellenmesini gerektirebilir ki bu da b\u00fcy\u00fck bir i\u015f y\u00fck\u00fc ve hata potansiyeli demektir. \u00d6rne\u011fin, bir <code>Users<\/code> tablosuna yeni bir s\u00fctun eklendi\u011finde, bu s\u00fctunu kullanan t\u00fcm sorgular\u0131n manuel olarak g\u00fcncellenmesi gerekir. Bu durum, \u00f6zellikle birden fazla geli\u015ftiricinin \u00e7al\u0131\u015ft\u0131\u011f\u0131 projelerde koordinasyon sorunlar\u0131na ve tutars\u0131zl\u0131klara yol a\u00e7abilir.<\/p>\n<p>Son olarak, <strong>tip g\u00fcvenli\u011fi eksikli\u011fi<\/strong>, modern geli\u015ftirme ortamlar\u0131nda \u00f6nemli bir dezavantajd\u0131r. Ham SQL sorgular\u0131, derleme zaman\u0131nda (compile-time) herhangi bir tip kontrol\u00fc sunmaz. Bu da, veritaban\u0131ndan beklenen veri tipinin veya yap\u0131s\u0131n\u0131n uygulama taraf\u0131nda yanl\u0131\u015f anla\u015f\u0131lmas\u0131 durumunda \u00e7al\u0131\u015fma zaman\u0131 (runtime) hatalar\u0131na yol a\u00e7ar. TypeScript gibi tip-g\u00fcvenli dillerin yayg\u0131nla\u015fmas\u0131yla birlikte, geli\u015ftiriciler veritaban\u0131 etkile\u015fimlerinde de benzer bir tip g\u00fcvenli\u011fi aray\u0131\u015f\u0131na girmi\u015flerdir. Ham SQL, bu ihtiyac\u0131 kar\u015f\u0131lamaktan uzakt\u0131r ve geli\u015ftiricilerin s\u00fcrekli olarak veritaban\u0131 \u015femas\u0131n\u0131 ak\u0131llar\u0131nda tutmas\u0131n\u0131 veya manuel olarak kontrol etmesini gerektirir, bu da geli\u015ftirme h\u0131z\u0131n\u0131 d\u00fc\u015f\u00fcr\u00fcr ve hatalara davetiye \u00e7\u0131kar\u0131r.<\/p>\n<p>Bu zorluklar, geli\u015ftiricileri daha verimli, g\u00fcvenli ve s\u00fcrd\u00fcr\u00fclebilir bir veritaban\u0131 etkile\u015fimi y\u00f6ntemi aramaya itmi\u015ftir. \u0130\u015fte bu noktada, Object-Relational Mapping (ORM) ara\u00e7lar\u0131, \u00f6zellikle de Prisma ORM gibi modern \u00e7\u00f6z\u00fcmler, devreye girerek bu sorunlara kapsaml\u0131 \u00e7\u00f6z\u00fcmler sunmaktad\u0131r. Ham SQL&#8217;in getirdi\u011fi bu kabustan kurtulmak i\u00e7in, ORM&#8217;lerin sundu\u011fu avantajlar\u0131 ve Prisma&#8217;n\u0131n \u00f6zel yeteneklerini ke\u015ffetmek, modern uygulama geli\u015ftirmede kritik bir ad\u0131md\u0131r.<\/p>\n<h2>ORM Nedir ve Veritaban\u0131 Etkile\u015fimini Nas\u0131l Kolayla\u015ft\u0131r\u0131r?<\/h2>\n<p>Object-Relational Mapping (ORM), T\u00fcrk\u00e7e kar\u015f\u0131l\u0131\u011f\u0131yla Nesne-\u0130li\u015fkisel E\u015fleme, nesne y\u00f6nelimli programlama (OOP) dilleri ile ili\u015fkisel veritabanlar\u0131 aras\u0131nda bir k\u00f6pr\u00fc g\u00f6revi g\u00f6ren bir programlama tekni\u011fidir. K\u0131saca, uygulaman\u0131zdaki s\u0131n\u0131flar\u0131 (class) ve nesneleri (object) veritaban\u0131 tablolar\u0131na ve sat\u0131rlar\u0131na e\u015fleyerek, veritaban\u0131 i\u015flemlerini do\u011frudan programlama dilinizin nesneleri \u00fczerinden yapman\u0131z\u0131 sa\u011flar. Bu sayede, SQL sorgular\u0131 yazmak yerine, programlama dilinizin do\u011fal yap\u0131s\u0131n\u0131 kullanarak veritaban\u0131 etkile\u015fiminde bulunabilirsiniz.<\/p>\n<p>ORM kullanman\u0131n en \u00f6nemli avantajlar\u0131ndan biri <strong>veritaban\u0131ndan ba\u011f\u0131ms\u0131zl\u0131k<\/strong> sa\u011flamas\u0131d\u0131r. \u00c7o\u011fu ORM arac\u0131, farkl\u0131 veritaban\u0131 sistemlerini (PostgreSQL, MySQL, SQL Server, SQLite vb.) destekler. Bu, uygulaman\u0131z\u0131n veritaban\u0131 katman\u0131n\u0131 de\u011fi\u015ftirmek istedi\u011finizde, kodunuzun b\u00fcy\u00fck bir k\u0131sm\u0131n\u0131 yeniden yazmak zorunda kalmaman\u0131z anlam\u0131na gelir. \u00d6rne\u011fin, uygulaman\u0131z\u0131 geli\u015ftirirken SQLite kullan\u0131p daha sonra \u00fcretim ortam\u0131nda PostgreSQL&#8217;e ge\u00e7mek istedi\u011finizde, ORM sayesinde veritaban\u0131 ba\u011flant\u0131 ayarlar\u0131n\u0131 de\u011fi\u015ftirmek \u00e7o\u011fu zaman yeterli olacakt\u0131r. Bu, geli\u015ftirme esnekli\u011fini art\u0131r\u0131r ve gelecekteki de\u011fi\u015fikliklere kar\u015f\u0131 uygulaman\u0131z\u0131 daha diren\u00e7li hale getirir.<\/p>\n<p>Di\u011fer bir b\u00fcy\u00fck avantaj ise <strong>tip g\u00fcvenli\u011fi ve kod okunabilirli\u011fi<\/strong>dir. \u00d6zellikle TypeScript gibi statik tipli dillerle kullan\u0131ld\u0131\u011f\u0131nda, ORM&#8217;ler veritaban\u0131 \u015feman\u0131z\u0131 uygulama kodunuza yans\u0131tan tipler (types) \u00fcretir. Bu sayede, sorgular\u0131n\u0131z\u0131 yazarken otomatik tamamlama (autocomplete) \u00f6zelliklerinden faydalanabilir, olas\u0131 tip hatalar\u0131n\u0131 derleme zaman\u0131nda yakalayabilir ve \u00e7al\u0131\u015fma zaman\u0131 (runtime) hatalar\u0131n\u0131 minimuma indirebilirsiniz. Kodunuz daha okunakl\u0131 ve anla\u015f\u0131l\u0131r hale gelir, \u00e7\u00fcnk\u00fc veritaban\u0131 tablolar\u0131 yerine tan\u0131d\u0131k nesneler ve \u00f6zelliklerle \u00e7al\u0131\u015f\u0131rs\u0131n\u0131z. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n ad\u0131n\u0131 almak i\u00e7in <code>SELECT name FROM users WHERE id = 1;<\/code> yazmak yerine, <code>await prisma.user.findUnique({ where: { id: 1 } }).name;<\/code> gibi daha sezgisel bir ifade kullan\u0131rs\u0131n\u0131z.<\/p>\n<p>ORM&#8217;ler ayr\u0131ca <strong>geli\u015ftirme h\u0131z\u0131n\u0131 art\u0131r\u0131r<\/strong>. Tekrarlayan SQL sorgular\u0131 yazma ve veri e\u015fleme i\u015flemlerini otomatikle\u015ftirerek, geli\u015ftiricilerin daha \u00e7ok i\u015f mant\u0131\u011f\u0131na odaklanmas\u0131n\u0131 sa\u011flar. Karma\u015f\u0131k sorgular\u0131 bile birka\u00e7 sat\u0131r kodla ifade etme yetene\u011fi, prototipleme ve \u00f6zellik geli\u015ftirme s\u00fcre\u00e7lerini h\u0131zland\u0131r\u0131r. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n t\u00fcm g\u00f6nderilerini \u00e7ekmek i\u00e7in karma\u015f\u0131k bir JOIN sorgusu yazmak yerine, ORM genellikle tek bir metot \u00e7a\u011fr\u0131s\u0131 ile bu i\u015flemi halleder.<\/p>\n<p>Elbette, ORM&#8217;lerin baz\u0131 dezavantajlar\u0131 da vard\u0131r. Ba\u015flang\u0131\u00e7ta bir <strong>\u00f6\u011frenme e\u011frisi<\/strong> olabilir ve ORM&#8217;in nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 anlamak zaman alabilir. Baz\u0131 durumlarda, ORM&#8217;in \u00fcretti\u011fi SQL sorgular\u0131 manuel yaz\u0131lan sorgular kadar optimize olmayabilir, bu da potansiyel <strong>performans sorunlar\u0131na<\/strong> yol a\u00e7abilir. Ancak modern ORM&#8217;ler, bu t\u00fcr sorunlar\u0131 minimize etmek i\u00e7in s\u00fcrekli olarak geli\u015ftirilmektedir. Prisma, bu konuda \u00f6zellikle ba\u015far\u0131l\u0131d\u0131r; sorgular\u0131 do\u011frudan veritaban\u0131na g\u00f6ndererek ve karma\u015f\u0131k JOIN&#8217;ler yerine ak\u0131ll\u0131 sorgu optimizasyonlar\u0131 yaparak y\u00fcksek performans sunar.<\/p>\n<p>Prisma&#8217;n\u0131n di\u011fer ORM&#8217;lerden fark\u0131, <strong>schema-first (\u015fema \u00f6ncelikli) yakla\u015f\u0131m\u0131<\/strong> ve g\u00fc\u00e7l\u00fc <strong>TypeScript entegrasyonu<\/strong>dur. Prisma, veritaban\u0131 \u015feman\u0131z\u0131 tan\u0131mlad\u0131\u011f\u0131n\u0131z ayr\u0131 bir <code>schema.prisma<\/code> dosyas\u0131 kullan\u0131r. Bu \u015fema dosyas\u0131ndan yola \u00e7\u0131karak, veritaban\u0131n\u0131z\u0131 olu\u015fturur\/g\u00fcnceller ve uygulaman\u0131z i\u00e7in tip-g\u00fcvenli bir istemci (Prisma Client) \u00fcretir. Bu yakla\u015f\u0131m, veritaban\u0131 ve uygulama kodunuz aras\u0131nda her zaman tutarl\u0131l\u0131k olmas\u0131n\u0131 sa\u011flar. Geli\u015ftiriciler, veritaban\u0131 \u015femalar\u0131n\u0131 tek bir merkezi yerden y\u00f6netirken, ayn\u0131 zamanda uygulama kodlar\u0131nda tam tip g\u00fcvenli\u011fi ve otomatik tamamlama \u00f6zelliklerinden faydalan\u0131r. Bu benzersiz yakla\u015f\u0131m, Prisma&#8217;y\u0131 modern web geli\u015ftirme d\u00fcnyas\u0131nda \u00f6ne \u00e7\u0131karan temel \u00f6zelliklerden biridir.<\/p>\n<h2>Prisma ORM&#8217;e \u0130lk Ad\u0131mlar: Kurulum ve Schema Tan\u0131mlama S\u00fcreci Nas\u0131l \u0130\u015fler?<\/h2>\n<p>Prisma ORM ile \u00e7al\u0131\u015fmaya ba\u015flamak, ham SQL&#8217;in karma\u015f\u0131k d\u00fcnyas\u0131ndan uzakla\u015farak daha d\u00fczenli ve tip-g\u00fcvenli bir veritaban\u0131 etkile\u015fimi yolculu\u011funa \u00e7\u0131kman\u0131n ilk ad\u0131m\u0131d\u0131r. Bu b\u00f6l\u00fcmde, Prisma&#8217;y\u0131 projenize nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, temel \u015fema (schema) tan\u0131mlamalar\u0131n\u0131 nas\u0131l yapaca\u011f\u0131n\u0131z\u0131 ve veritaban\u0131n\u0131z\u0131 nas\u0131l senkronize edece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenece\u011fiz.<\/p>\n<h3>Prisma Kurulumu<\/h3>\n<p>Prisma&#8217;y\u0131 projenize dahil etmek olduk\u00e7a basittir. \u00d6ncelikle, projenizin k\u00f6k dizininde bir terminal a\u00e7\u0131n ve a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131rarak Prisma CLI&#8217;y\u0131 ve Prisma Client&#8217;\u0131 y\u00fckleyin:<\/p>\n<div class=\"code-container\">\n<pre><code>npm install prisma --save-dev\nnpm install @prisma\/client<\/code><\/pre>\n<\/div>\n<p>Burada <code>prisma<\/code> paketi, Prisma CLI (Komut Sat\u0131r\u0131 Aray\u00fcz\u00fc) ara\u00e7lar\u0131n\u0131 i\u00e7erir ve geli\u015ftirme ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 olarak eklenir. <code>@prisma\/client<\/code> ise uygulaman\u0131z\u0131n veritaban\u0131yla etkile\u015fim kurmas\u0131n\u0131 sa\u011flayan tip-g\u00fcvenli istemciyi i\u00e7erir ve \u00fcretim ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 olarak eklenir.<\/p>\n<p>Kurulum tamamland\u0131ktan sonra, Prisma projenizi ba\u015flatmak i\u00e7in a\u015fa\u011f\u0131daki komutu kullan\u0131n:<\/p>\n<div class=\"code-container\">\n<pre><code>npx prisma init<\/code><\/pre>\n<\/div>\n<p>Bu komut, projenizin k\u00f6k dizininde bir <code>prisma<\/code> klas\u00f6r\u00fc olu\u015fturacak ve bu klas\u00f6r\u00fcn i\u00e7ine <code>schema.prisma<\/code> ad\u0131nda bir dosya yerle\u015ftirecektir. Ayr\u0131ca, veritaban\u0131 ba\u011flant\u0131 ayarlar\u0131n\u0131z\u0131 tutmak i\u00e7in bir <code>.env<\/code> dosyas\u0131 da olu\u015fturulacakt\u0131r. <code>.env<\/code> dosyas\u0131nda, veritaban\u0131 ba\u011flant\u0131 dizenizi (connection string) tan\u0131mlaman\u0131z gerekecektir. \u00d6rne\u011fin, PostgreSQL i\u00e7in \u015f\u00f6yle bir ba\u011flant\u0131 dizesi kullanabilirsiniz:<\/p>\n<div class=\"code-container\">\n<pre><code>DATABASE_URL=\"postgresql:\/\/user:password@localhost:5432\/mydb?schema=public\"<\/code><\/pre>\n<\/div>\n<p>Veritaban\u0131 t\u00fcr\u00fcn\u00fcze g\u00f6re bu dizeyi uygun \u015fekilde d\u00fczenlemeniz \u00f6nemlidir.<\/p>\n<h3>Schema Tan\u0131mlama: schema.prisma Dosyas\u0131n\u0131n Yap\u0131s\u0131<\/h3>\n<p><code>schema.prisma<\/code> dosyas\u0131, Prisma&#8217;n\u0131n kalbidir. Bu dosya, veritaban\u0131 ba\u011flant\u0131n\u0131z\u0131, kullan\u0131lacak istemciyi ve veritaban\u0131 model tan\u0131mlar\u0131n\u0131z\u0131 i\u00e7erir. Temel olarak \u00fc\u00e7 ana bloktan olu\u015fur:<\/p>\n<ul>\n<li><strong><code>datasource<\/code> blo\u011fu:<\/strong> Veritaban\u0131 ba\u011flant\u0131 bilgilerinizi tan\u0131mlar. Hangi veritaban\u0131 sa\u011flay\u0131c\u0131s\u0131n\u0131 kulland\u0131\u011f\u0131n\u0131z\u0131 ve ba\u011flant\u0131 URL&#8217;sini belirtir.<\/li>\n<li><strong><code>generator<\/code> blo\u011fu:<\/strong> Prisma Client&#8217;\u0131n nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 tan\u0131mlar. Genellikle <code>provider = \"prisma-client-js\"<\/code> olarak ayarlan\u0131r ve TypeScript veya JavaScript i\u00e7in istemci kodunu \u00fcretir.<\/li>\n<li><strong><code>model<\/code> bloklar\u0131:<\/strong> Veritaban\u0131n\u0131zdaki tablolar\u0131 ve bunlar\u0131n s\u00fctunlar\u0131n\u0131 temsil eden modelleri tan\u0131mlar. Bu bloklar, uygulaman\u0131zdaki veri yap\u0131lar\u0131na do\u011frudan kar\u015f\u0131l\u0131k gelir ve Prisma&#8217;n\u0131n tip g\u00fcvenli\u011fi sa\u011flamas\u0131n\u0131n temelini olu\u015fturur.<\/li>\n<\/ul>\n<p>Basit bir <code>User<\/code> (Kullan\u0131c\u0131) modeli \u00f6rne\u011fi \u00fczerinden gidelim. Bir kullan\u0131c\u0131 modelinin kimlik (id), e-posta (email), isim (name) ve kay\u0131t tarihi (createdAt) alanlar\u0131na sahip oldu\u011funu varsayal\u0131m:<\/p>\n<div class=\"code-container\">\n<pre><code>\/\/ prisma\/schema.prisma\n\ndatasource db {\n  provider = \"postgresql\" \/\/ veya \"mysql\", \"sqlite\", \"sqlserver\"\n  url      = env(\"DATABASE_URL\")\n}\n\ngenerator client {\n  provider = \"prisma-client-js\"\n}\n\nmodel User {\n  id        Int      @id @default(autoincrement())\n  email     String   @unique\n  name      String?\n  createdAt DateTime @default(now())\n  updatedAt DateTime @updatedAt\n}<\/code><\/pre>\n<\/div>\n<p>Yukar\u0131daki model tan\u0131m\u0131nda dikkat etmeniz gereken baz\u0131 noktalar var:<\/p>\n<ul>\n<li><code>model User { ... }<\/code>: Bir <code>User<\/code> modeli tan\u0131mlar. Bu, veritaban\u0131nda <code>users<\/code> ad\u0131nda bir tabloya kar\u015f\u0131l\u0131k gelecektir (Prisma varsay\u0131lan olarak \u00e7o\u011ful isimlendirme kullan\u0131r).<\/li>\n<li><code>id Int @id @default(autoincrement())<\/code>: <code>id<\/code> alan\u0131 bir tam say\u0131d\u0131r (<code>Int<\/code>), birincil anahtard\u0131r (<code>@id<\/code>) ve otomatik artan bir de\u011fere sahiptir (<code>@default(autoincrement())<\/code>).<\/li>\n<li><code>email String @unique<\/code>: <code>email<\/code> alan\u0131 bir metin dizisidir (<code>String<\/code>) ve her kullan\u0131c\u0131n\u0131n e-postas\u0131 benzersiz olmal\u0131d\u0131r (<code>@unique<\/code>).<\/li>\n<li><code>name String?<\/code>: <code>name<\/code> alan\u0131 iste\u011fe ba\u011fl\u0131d\u0131r (<code>?<\/code> i\u015fareti, bu alan\u0131n <code>null<\/code> olabilece\u011fini belirtir).<\/li>\n<li><code>createdAt DateTime @default(now())<\/code>: <code>createdAt<\/code> alan\u0131 bir tarih ve saat tipindedir ve varsay\u0131lan olarak kayd\u0131n olu\u015fturuldu\u011fu an\u0131 al\u0131r.<\/li>\n<li><code>updatedAt DateTime @updatedAt<\/code>: <code>updatedAt<\/code> alan\u0131 da bir tarih ve saat tipindedir ve kay\u0131t her g\u00fcncellendi\u011finde otomatik olarak g\u00fcncellenir.<\/li>\n<\/ul>\n<h3>Veritaban\u0131 Senkronizasyonu: Prisma Migrate<\/h3>\n<p><code>schema.prisma<\/code> dosyas\u0131nda modellerinizi tan\u0131mlad\u0131ktan sonra, bu \u015femay\u0131 veritaban\u0131n\u0131za uygulamak i\u00e7in Prisma Migrate&#8217;i kullanman\u0131z gerekir. Migrate, veritaban\u0131n\u0131zdaki \u015fema de\u011fi\u015fikliklerini izlemenizi ve y\u00f6netmenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r.<\/p>\n<div class=\"code-container\">\n<pre><code>npx prisma migrate dev --name init<\/code><\/pre>\n<\/div>\n<p>Bu komut:<\/p>\n<ul>\n<li>Veritaban\u0131n\u0131zda <code>_prisma_migrations<\/code> ad\u0131nda bir tablo olu\u015fturur (e\u011fer yoksa) ve bu tabloya migrasyon ge\u00e7mi\u015fini kaydeder.<\/li>\n<li><code>prisma\/migrations<\/code> klas\u00f6r\u00fc i\u00e7inde yeni bir migrasyon dosyas\u0131 olu\u015fturur. Bu dosya, veritaban\u0131 \u015feman\u0131zdaki de\u011fi\u015fiklikleri i\u00e7eren SQL komutlar\u0131n\u0131 bar\u0131nd\u0131r\u0131r.<\/li>\n<li>Veritaban\u0131n\u0131zda <code>User<\/code> tablosunu olu\u015fturur.<\/li>\n<li>Son olarak, en g\u00fcncel Prisma Client&#8217;\u0131 olu\u015fturur veya g\u00fcnceller.<\/li>\n<\/ul>\n<p>Art\u0131k veritaban\u0131n\u0131z, <code>schema.prisma<\/code> dosyan\u0131zdaki tan\u0131mlara uygun olarak haz\u0131r. Bir sonraki ad\u0131mda, bu \u015fema \u00fczerinden nas\u0131l veri sorgulayaca\u011f\u0131m\u0131z\u0131 ve manip\u00fcle edece\u011fimizi \u00f6\u011frenece\u011fiz.<\/p>\n<h3>Prisma Client ile G\u00fcvenli Veri Sorgulamalar\u0131 Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Prisma Client, <code>schema.prisma<\/code> dosyan\u0131zdan otomatik olarak \u00fcretilen tip-g\u00fcvenli bir sorgu olu\u015fturucudur. Uygulaman\u0131z\u0131n veritaban\u0131yla etkile\u015fim kurmas\u0131n\u0131 sa\u011flayan ana ara\u00e7t\u0131r. Geli\u015ftirme ortam\u0131n\u0131zda Prisma Client&#8217;\u0131 kullanarak, ham SQL sorgular\u0131 yazma derdinden kurtulur ve TypeScript&#8217;in sundu\u011fu t\u00fcm tip g\u00fcvenli\u011fi avantajlar\u0131ndan faydalan\u0131rs\u0131n\u0131z. Bu sayede, hem kodunuz daha temiz ve okunabilir olur hem de olas\u0131 hatalar\u0131 derleme zaman\u0131nda yakalayarak \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131n\u0131 minimize edersiniz.<\/p>\n<h4>Prisma Client&#8217;\u0131n Ba\u015flat\u0131lmas\u0131<\/h4>\n<p>Prisma Client&#8217;\u0131 kullanmaya ba\u015flamadan \u00f6nce, uygulaman\u0131zda onu ba\u015flatman\u0131z gerekir. Genellikle, uygulaman\u0131z\u0131n ba\u015flang\u0131\u00e7 dosyas\u0131nda (\u00f6rne\u011fin <code>index.ts<\/code> veya <code>app.ts<\/code>) tek bir \u00f6rnek (instance) olu\u015fturulur ve bu \u00f6rnek uygulaman\u0131n di\u011fer b\u00f6l\u00fcmlerinde kullan\u0131l\u0131r.<\/p>\n<div class=\"code-container\">\n<pre><code>\/\/ src\/index.ts (veya benzeri bir dosya)\nimport { PrismaClient } from '@prisma\/client';\n\nconst prisma = new PrismaClient();\n\nasync function main() {\n  \/\/ Veritaban\u0131 i\u015flemleri burada yap\u0131lacak\n}\n\nmain()\n  .catch(e => {\n    console.error(e);\n    process.exit(1);\n  })\n  .finally(async () => {\n    await prisma.$disconnect(); \/\/ Uygulama kapan\u0131rken ba\u011flant\u0131y\u0131 kes\n  });<\/code><\/pre>\n<\/div>\n<p>Yukar\u0131daki kodda, <code>PrismaClient<\/code> s\u0131n\u0131f\u0131n\u0131 i\u00e7e aktar\u0131yor ve ondan bir \u00f6rnek olu\u015fturuyoruz. <code>main<\/code> fonksiyonu i\u00e7inde asenkron veritaban\u0131 i\u015flemlerimizi ger\u00e7ekle\u015ftirece\u011fiz. <code>finally<\/code> blo\u011fu, uygulaman\u0131n kapanmas\u0131 durumunda veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131n d\u00fczg\u00fcn bir \u015fekilde kesilmesini sa\u011flar.<\/p>\n<h4>Temel CRUD \u0130\u015flemleri (Create, Read, Update, Delete)<\/h4>\n<p>Prisma Client, veritaban\u0131ndaki CRUD (Create, Read, Update, Delete) i\u015flemlerini ger\u00e7ekle\u015ftirmek i\u00e7in sezgisel ve tip-g\u00fcvenli metotlar sunar. Daha \u00f6nce tan\u0131mlad\u0131\u011f\u0131m\u0131z <code>User<\/code> modelini kullanarak bu i\u015flemleri inceleyelim:<\/p>\n<h5>1. Veri Olu\u015fturma (Create)<\/h5>\n<p>Yeni bir kay\u0131t eklemek i\u00e7in <code>create<\/code> metodunu kullan\u0131r\u0131z. Bu metot, eklemek istedi\u011finiz verileri bir nesne (object) olarak al\u0131r:<\/p>\n<div class=\"code-container\">\n<pre><code>async function createUser() {\n  const user = await prisma.user.create({\n    data: {\n      email: 'test@example.com',\n      name: 'Test Kullan\u0131c\u0131',\n    },\n  });\n  console.log('Olu\u015fturulan Kullan\u0131c\u0131:', user);\n  return user;\n}<\/code><\/pre>\n<\/div>\n<p>Prisma, <code>data<\/code> nesnesindeki alanlar\u0131n <code>User<\/code> modelinizle e\u015fle\u015fti\u011fini otomatik olarak kontrol eder. TypeScript kullan\u0131yorsan\u0131z, yanl\u0131\u015f bir alan ad\u0131 veya tip kullanman\u0131z durumunda derleme zaman\u0131nda hata al\u0131rs\u0131n\u0131z.<\/p>\n<h5>2. Veri Okuma (Read)<\/h5>\n<p>Veritaban\u0131ndan veri \u00e7ekmek i\u00e7in \u00e7e\u015fitli metotlar bulunur:<\/p>\n<ul>\n<li><strong><code>findMany<\/code>:<\/strong> Birden fazla kay\u0131t \u00e7ekmek i\u00e7in kullan\u0131l\u0131r. Filtreleme, s\u0131ralama ve sayfalama se\u00e7enekleri sunar.<\/li>\n<li><strong><code>findUnique<\/code>:<\/strong> Benzersiz bir alan (\u00f6rne\u011fin <code>@unique<\/code> veya <code>@id<\/code> ile i\u015faretlenmi\u015f alan) \u00fczerinden tek bir kay\u0131t \u00e7ekmek i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><strong><code>findFirst<\/code>:<\/strong> Belirtilen ko\u015fullara uyan ilk kayd\u0131 d\u00f6nd\u00fcr\u00fcr.<\/li>\n<\/ul>\n<div class=\"code-container\">\n<pre><code>async function findUsers() {\n  \/\/ T\u00fcm kullan\u0131c\u0131lar\u0131 \u00e7ekme\n  const allUsers = await prisma.user.findMany();\n  console.log('T\u00fcm Kullan\u0131c\u0131lar:', allUsers);\n\n  \/\/ Belirli bir e-posta adresine sahip kullan\u0131c\u0131y\u0131 \u00e7ekme\n  const userByEmail = await prisma.user.findUnique({\n    where: {\n      email: 'test@example.com',\n    },\n  });\n  console.log('E-posta ile Kullan\u0131c\u0131:', userByEmail);\n\n  \/\/ Ad\u0131 \"Test\" ile ba\u015flayan ilk kullan\u0131c\u0131y\u0131 \u00e7ekme\n  const firstUserWithNameTest = await prisma.user.findFirst({\n    where: {\n      name: {\n        startsWith: 'Test',\n      },\n    },\n  });\n  console.log('Ad\u0131 Test ile Ba\u015flayan \u0130lk Kullan\u0131c\u0131:', firstUserWithNameTest);\n}<\/code><\/pre>\n<\/div>\n<p>Bu sorgularda <code>where<\/code> nesnesi, SQL&#8217;deki <code>WHERE<\/code> ko\u015fuluna kar\u015f\u0131l\u0131k gelir ve geli\u015fmi\u015f filtreleme se\u00e7enekleri sunar.<\/p>\n<h5>3. Veri G\u00fcncelleme (Update)<\/h5>\n<p>Mevcut kay\u0131tlar\u0131 g\u00fcncellemek i\u00e7in <code>update<\/code> veya <code>updateMany<\/code> metotlar\u0131n\u0131 kullan\u0131r\u0131z:<\/p>\n<ul>\n<li><strong><code>update<\/code>:<\/strong> Benzersiz bir ko\u015ful (genellikle <code>id<\/code> veya <code>@unique<\/code> alan) \u00fczerinden tek bir kayd\u0131 g\u00fcnceller.<\/li>\n<li><strong><code>updateMany<\/code>:<\/strong> Belirtilen ko\u015fullara uyan birden fazla kayd\u0131 g\u00fcnceller.<\/li>\n<\/ul>\n<div class=\"code-container\">\n<pre><code>async function updateUser(userId: number) {\n  const updatedUser = await prisma.user.update({\n    where: {\n      id: userId,\n    },\n    data: {\n      name: 'G\u00fcncel \u0130sim',\n      email: 'updated@example.com',\n    },\n  });\n  console.log('G\u00fcncellenen Kullan\u0131c\u0131:', updatedUser);\n  return updatedUser;\n}\n\nasync function updateMultipleUsers() {\n  const { count } = await prisma.user.updateMany({\n    where: {\n      name: {\n        contains: 'Kullan\u0131c\u0131',\n      },\n    },\n    data: {\n      name: 'Yeni Genel \u0130sim',\n    },\n  });\n  console.log(<code>${count} kullan\u0131c\u0131 g\u00fcncellendi.<\/code>);\n}<\/code><\/pre>\n<\/div>\n<p><code>updateMany<\/code> metodu, ka\u00e7 kayd\u0131n g\u00fcncellendi\u011fini belirten bir nesne d\u00f6nd\u00fcr\u00fcr.<\/p>\n<h5>4. Veri Silme (Delete)<\/h5>\n<p>Kay\u0131tlar\u0131 silmek i\u00e7in <code>delete<\/code> veya <code>deleteMany<\/code> metotlar\u0131n\u0131 kullan\u0131r\u0131z:<\/p>\n<ul>\n<li><strong><code>delete<\/code>:<\/strong> Benzersiz bir ko\u015ful \u00fczerinden tek bir kayd\u0131 siler.<\/li>\n<li><strong><code>deleteMany<\/code>:<\/strong> Belirtilen ko\u015fullara uyan birden fazla kayd\u0131 siler.<\/li>\n<\/ul>\n<div class=\"code-container\">\n<pre><code>async function deleteUser(userId: number) {\n  const deletedUser = await prisma.user.delete({\n    where: {\n      id: userId,\n    },\n  });\n  console.log('Silinen Kullan\u0131c\u0131:', deletedUser);\n  return deletedUser;\n}\n\nasync function deleteMultipleUsers() {\n  const { count } = await prisma.user.deleteMany({\n    where: {\n      email: {\n        endsWith: '@example.com',\n      },\n    },\n  });\n  console.log(<code>${count} kullan\u0131c\u0131 silindi.<\/code>);\n}<\/code><\/pre>\n<\/div>\n<p>Prisma Client, bu temel CRUD i\u015flemlerini TypeScript ile tam entegre bir \u015fekilde sunarak geli\u015ftiricilere g\u00fcvenli, h\u0131zl\u0131 ve hatas\u0131z bir veritaban\u0131 etkile\u015fimi deneyimi sa\u011flar. Her bir metodun parametreleri ve d\u00f6n\u00fc\u015f tipleri, model tan\u0131mlar\u0131n\u0131zdan otomatik olarak t\u00fcretilir, bu da size m\u00fckemmel bir geli\u015ftirici deneyimi ve g\u00fc\u00e7l\u00fc bir tip g\u00fcvenli\u011fi katman\u0131 sunar.<\/p>\n<h3>\u0130li\u015fkisel Veritaban\u0131 Modelleri ve Prisma&#8217;n\u0131n \u0130li\u015fki Y\u00f6netimi Yetenekleri<\/h3>\n<p>Modern uygulamalar genellikle birden fazla veri modelini ve bu modeller aras\u0131ndaki ili\u015fkileri i\u00e7erir. \u00d6rne\u011fin, bir blog uygulamas\u0131nda kullan\u0131c\u0131lar (<code>User<\/code>) g\u00f6nderiler (<code>Post<\/code>) olu\u015fturabilir, g\u00f6nderilerin yorumlar\u0131 (<code>Comment<\/code>) olabilir ve bu yorumlar da belirli kullan\u0131c\u0131lara ait olabilir. Prisma ORM, bu t\u00fcr karma\u015f\u0131k ili\u015fkisel yap\u0131lar\u0131 <code>schema.prisma<\/code> dosyas\u0131nda kolayca tan\u0131mlaman\u0131za ve bu ili\u015fkiler \u00fczerinden veri sorgulaman\u0131za olanak tan\u0131r.<\/p>\n<h4>Model \u0130li\u015fkileri Tan\u0131mlama<\/h4>\n<p>Prisma&#8217;da ili\u015fkiler, model alanlar\u0131na eklenen \u00f6zel nitelikler (attributes) ve tipler (types) arac\u0131l\u0131\u011f\u0131yla tan\u0131mlan\u0131r. En yayg\u0131n ili\u015fki t\u00fcrleri \u015funlard\u0131r:<\/p>\n<ol>\n<li><strong>Bire Bir (One-to-One):<\/strong> Bir modelin bir \u00f6rne\u011fi, di\u011fer modelin yaln\u0131zca bir \u00f6rne\u011fiyle ili\u015fkilidir.<\/li>\n<li><strong>Bire \u00c7ok (One-to-Many):<\/strong> Bir modelin bir \u00f6rne\u011fi, di\u011fer modelin birden \u00e7ok \u00f6rne\u011fiyle ili\u015fkilidir.<\/li>\n<li><strong>\u00c7oka \u00c7ok (Many-to-Many):<\/strong> Bir modelin birden \u00e7ok \u00f6rne\u011fi, di\u011fer modelin birden \u00e7ok \u00f6rne\u011fiyle ili\u015fkilidir.<\/li>\n<\/ol>\n<p>\u00d6rnek olarak, bir <code>User<\/code>&#8216;\u0131n birden fazla <code>Post<\/code>&#8216;u olabilece\u011fi &#8220;Bire \u00c7ok&#8221; ili\u015fkisini inceleyelim. \u00d6ncelikle <code>schema.prisma<\/code> dosyam\u0131z\u0131 g\u00fcncelleyelim:<\/p>\n<div class=\"code-container\">\n<pre><code>\/\/ prisma\/schema.prisma\n\nmodel User {\n  id        Int      @id @default(autoincrement())\n  email     String   @unique\n  name      String?\n  createdAt DateTime @default(now())\n  updatedAt DateTime @updatedAt\n  posts     Post[] \/\/ Bir kullan\u0131c\u0131n\u0131n birden fazla g\u00f6nderisi olabilir\n}\n\nmodel Post {\n  id        Int      @id @default(autoincrement())\n  title     String\n  content   String?\n  published Boolean  @default(false)\n  author    User     @relation(fields: [authorId], references: [id]) \/\/ G\u00f6nderinin bir yazar\u0131 var\n  authorId  Int      \/\/ Yazar\u0131n ID'si\n  createdAt DateTime @default(now())\n  updatedAt DateTime @updatedAt\n}<\/code><\/pre>\n<\/div>\n<p>Yukar\u0131daki \u00f6rnekte:<\/p>\n<ul>\n<li><code>User<\/code> modeline <code>posts Post[]<\/code> alan\u0131 eklendi. Bu, bir <code>User<\/code> \u00f6rne\u011finin birden fazla <code>Post<\/code> \u00f6rne\u011fine sahip olabilece\u011fini belirtir. <code>Post[]<\/code>, bir <code>Post<\/code> dizisi (array) anlam\u0131na gelir.<\/li>\n<li><code>Post<\/code> modeline ise <code>author User @relation(fields: [authorId], references: [id])<\/code> ve <code>authorId Int<\/code> alanlar\u0131 eklendi.\n<ul>\n<li><code>authorId Int<\/code>: Bu, <code>User<\/code> modelinin birincil anahtar\u0131na (<code>id<\/code>) referans veren yabanc\u0131 anahtar (foreign key) s\u00fctunudur.<\/li>\n<li><code>author User<\/code>: Bu, <code>Post<\/code> \u00f6rne\u011finin ili\u015fkili oldu\u011fu <code>User<\/code> nesnesini temsil eden bir ili\u015fki alan\u0131d\u0131r.<\/li>\n<li><code>@relation(fields: [authorId], references: [id])<\/code>: Bu nitelik, <code>Post<\/code> modelindeki <code>authorId<\/code> alan\u0131n\u0131n <code>User<\/code> modelindeki <code>id<\/code> alan\u0131na referans verdi\u011fini Prisma&#8217;ya bildirir.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u015eema de\u011fi\u015fikliklerini uygulad\u0131ktan sonra, yeni bir migrasyon olu\u015fturmay\u0131 unutmay\u0131n:<\/p>\n<div class=\"code-container\">\n<pre><code>npx prisma migrate dev --name add_post_model<\/code><\/pre>\n<\/div>\n<h4>\u0130li\u015fkili Verileri Sorgulama: <code>include<\/code> ve <code>select<\/code><\/h4>\n<p>Prisma Client, ili\u015fkili verileri \u00e7ekmek i\u00e7in g\u00fc\u00e7l\u00fc <code>include<\/code> ve <code>select<\/code> se\u00e7enekleri sunar. Bu sayede, ihtiyac\u0131n\u0131z olan verileri tek bir sorguyla veritaban\u0131ndan alabilirsiniz, bu da N+1 sorgu sorununu (N+1 query problem) \u00f6nlemeye yard\u0131mc\u0131 olur.<\/p>\n<h5><code>include<\/code> ile \u0130li\u015fkili Verileri \u00c7ekme<\/h5>\n<p>Bir <code>User<\/code>&#8216;\u0131 \u00e7ekerken, ayn\u0131 zamanda o kullan\u0131c\u0131n\u0131n t\u00fcm g\u00f6nderilerini de \u00e7ekmek isteyebilirsiniz. Bunun i\u00e7in <code>include<\/code> se\u00e7ene\u011fini kullan\u0131r\u0131z:<\/p>\n<div class=\"code-container\">\n<pre><code>async function getUserWithPosts(userId: number) {\n  const userWithPosts = await prisma.user.findUnique({\n    where: { id: userId },\n    include: {\n      posts: true, \/\/ Kullan\u0131c\u0131n\u0131n g\u00f6nderilerini de dahil et\n    },\n  });\n  console.log('Kullan\u0131c\u0131 ve G\u00f6nderileri:', userWithPosts);\n  return userWithPosts;\n}<\/code><\/pre>\n<\/div>\n<p>Bu sorgu, <code>User<\/code> nesnesini ve bu nesnenin <code>posts<\/code> \u00f6zelli\u011fi alt\u0131nda ilgili t\u00fcm <code>Post<\/code> nesnelerini d\u00f6nd\u00fcrecektir. TypeScript, bu d\u00f6n\u00fc\u015f tipini otomatik olarak alg\u0131lar ve size tip g\u00fcvenli\u011fi sa\u011flar.<\/p>\n<p>Benzer \u015fekilde, bir <code>Post<\/code>&#8216;u \u00e7ekerken yazar bilgilerini de dahil edebiliriz:<\/p>\n<div class=\"code-container\">\n<pre><code>async function getPostWithAuthor(postId: number) {\n  const postWithAuthor = await prisma.post.findUnique({\n    where: { id: postId },\n    include: {\n      author: true, \/\/ G\u00f6nderinin yazar\u0131n\u0131 dahil et\n    },\n  });\n  console.log('G\u00f6nderi ve Yazar\u0131:', postWithAuthor);\n  return postWithAuthor;\n}<\/code><\/pre>\n<\/div>\n<h5><code>select<\/code> ile Belirli Alanlar\u0131 ve \u0130li\u015fkili Verileri \u00c7ekme<\/h5>\n<p>Bazen bir modelin t\u00fcm alanlar\u0131n\u0131 veya ili\u015fkili modelin t\u00fcm alanlar\u0131n\u0131 \u00e7ekmek istemeyebilirsiniz. Bu durumda <code>select<\/code> se\u00e7ene\u011fi devreye girer. <code>select<\/code> ile hem ana modelden hem de ili\u015fkili modellerden \u00e7ekmek istedi\u011finiz belirli alanlar\u0131 belirtebilirsiniz:<\/p>\n<div class=\"code-container\">\n<pre><code>async function getUserAndPostTitles(userId: number) {\n  const user = await prisma.user.findUnique({\n    where: { id: userId },\n    select: {\n      name: true,\n      email: true,\n      posts: {\n        select: {\n          title: true,\n          published: true,\n        },\n      },\n    },\n  });\n  console.log('Kullan\u0131c\u0131 Ad\u0131, E-posta ve G\u00f6nderi Ba\u015fl\u0131klar\u0131:', user);\n  return user;\n}<\/code><\/pre>\n<\/div>\n<p>Bu sorgu, sadece kullan\u0131c\u0131n\u0131n ad\u0131n\u0131, e-postas\u0131n\u0131 ve her bir g\u00f6nderisinin ba\u015fl\u0131\u011f\u0131n\u0131 ve yay\u0131nlanma durumunu d\u00f6nd\u00fcr\u00fcr. Bu, a\u011f trafi\u011fini azalt\u0131r ve sadece ihtiyac\u0131n\u0131z olan verileri \u00e7ekerek performans\u0131 art\u0131r\u0131r.<\/p>\n<p>Prisma&#8217;n\u0131n ili\u015fki y\u00f6netimi yetenekleri, karma\u015f\u0131k veri modelleriyle \u00e7al\u0131\u015f\u0131rken geli\u015ftirici deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir. \u0130li\u015fkileri a\u00e7\u0131k\u00e7a tan\u0131mlayarak ve <code>include<\/code>\/<code>select<\/code> gibi g\u00fc\u00e7l\u00fc sorgulama se\u00e7eneklerini kullanarak, uygulaman\u0131z\u0131n veritaban\u0131 etkile\u015fimini daha verimli, okunabilir ve hatas\u0131z hale getirebilirsiniz. Bu, \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli ve veri yo\u011fun uygulamalar geli\u015ftirirken zaman ve kaynak tasarrufu sa\u011flar.<\/p>\n<h2>Geli\u015fmi\u015f Prisma Kullan\u0131m\u0131: Filtreleme, S\u0131ralama ve Sayfalama Teknikleri<\/h2>\n<p>Uygulamalar b\u00fcy\u00fcd\u00fck\u00e7e ve veri miktar\u0131 artt\u0131k\u00e7a, sadece temel CRUD i\u015flemleri yeterli olmaz. Kullan\u0131c\u0131lar\u0131n belirli kriterlere g\u00f6re verileri filtrelemesi, sonu\u00e7lar\u0131 belirli bir d\u00fczene g\u00f6re s\u0131ralamas\u0131 ve b\u00fcy\u00fck veri k\u00fcmelerini k\u00fc\u00e7\u00fck, y\u00f6netilebilir sayfalara b\u00f6lerek g\u00f6r\u00fcnt\u00fclemesi gerekir. Prisma ORM, bu geli\u015fmi\u015f ihtiya\u00e7lar\u0131 kar\u015f\u0131lamak i\u00e7in zengin sorgu se\u00e7enekleri sunar. Bu b\u00f6l\u00fcmde, Prisma ile g\u00fc\u00e7l\u00fc filtreleme, s\u0131ralama ve sayfalama tekniklerini nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 inceleyece\u011fiz.<\/p>\n<h3>G\u00fc\u00e7l\u00fc Filtreleme (<code>where<\/code> Ko\u015fullar\u0131)<\/h3>\n<p>Prisma&#8217;n\u0131n <code>where<\/code> se\u00e7ene\u011fi, verileri belirli ko\u015fullara g\u00f6re filtrelemek i\u00e7in son derece esnek ve g\u00fc\u00e7l\u00fc bir yap\u0131 sunar. SQL&#8217;deki <code>WHERE<\/code> yan t\u00fcmcesine benzer \u015fekilde \u00e7al\u0131\u015f\u0131r, ancak JavaScript\/TypeScript nesneleri arac\u0131l\u0131\u011f\u0131yla daha sezgisel bir aray\u00fcz sa\u011flar.<\/p>\n<div class=\"code-container\">\n<pre><code>async function getFilteredPosts() {\n  \/\/ Ba\u015fl\u0131\u011f\u0131 \"Prisma\" i\u00e7eren ve yay\u0131nlanm\u0131\u015f g\u00f6nderileri bul\n  const publishedPrismaPosts = await prisma.post.findMany({\n    where: {\n      title: {\n        contains: 'Prisma', \/\/ SQL LIKE '%Prisma%'\n      },\n      published: true,\n    },\n  });\n  console.log('Yay\u0131nlanm\u0131\u015f Prisma G\u00f6nderileri:', publishedPrismaPosts);\n\n  \/\/ Belirli bir tarihten sonra olu\u015fturulan g\u00f6nderileri bul\n  const postsAfterDate = await prisma.post.findMany({\n    where: {\n      createdAt: {\n        gte: new Date('2023-01-01T00:00:00.000Z'), \/\/ Greater Than or Equal\n      },\n    },\n  });\n  console.log('Belirli Tarihten Sonraki G\u00f6nderiler:', postsAfterDate);\n}<\/code><\/pre>\n<\/div>\n<p>Prisma, ayr\u0131ca mant\u0131ksal operat\u00f6rler (<code>AND<\/code>, <code>OR<\/code>, <code>NOT<\/code>) kullanarak daha karma\u015f\u0131k filtreler olu\u015fturman\u0131za olanak tan\u0131r:<\/p>\n<div class=\"code-container\">\n<pre><code>async function getComplexFilteredUsers() {\n  const users = await prisma.user.findMany({\n    where: {\n      OR: [ \/\/ VEYA ko\u015fulu\n        {\n          email: {\n            endsWith: '@example.com',\n          },\n        },\n        {\n          name: {\n            startsWith: 'A',\n          },\n        },\n      ],\n      NOT: { \/\/ DE\u011e\u0130L ko\u015fulu\n        name: null, \/\/ Ad\u0131 null olmayan kullan\u0131c\u0131lar\n      },\n    },\n  });\n  console.log('Karma\u015f\u0131k Filtreli Kullan\u0131c\u0131lar:', users);\n}<\/code><\/pre>\n<\/div>\n<p>Bu filtreleme yetenekleri, kullan\u0131c\u0131lar\u0131n arama ve filtreleme ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lamak i\u00e7in son derece \u00f6nemlidir.<\/p>\n<h3>S\u0131ralama (<code>orderBy<\/code>)<\/h3>\n<p>Sorgu sonu\u00e7lar\u0131n\u0131 belirli bir alana g\u00f6re artan (ascending) veya azalan (descending) d\u00fczende s\u0131ralamak i\u00e7in <code>orderBy<\/code> se\u00e7ene\u011fini kullan\u0131r\u0131z:<\/p>\n<div class=\"code-container\">\n<pre><code>async function getOrderedPosts() {\n  \/\/ Ba\u015fl\u0131\u011fa g\u00f6re alfabetik s\u0131ralanm\u0131\u015f g\u00f6nderiler\n  const postsByTitle = await prisma.post.findMany({\n    orderBy: {\n      title: 'asc', \/\/ Artan s\u0131ra (A-Z)\n    },\n  });\n  console.log('Ba\u015fl\u0131\u011fa G\u00f6re S\u0131ral\u0131 G\u00f6nderiler:', postsByTitle);\n\n  \/\/ En son olu\u015fturulan g\u00f6nderiler\n  const latestPosts = await prisma.post.findMany({\n    orderBy: {\n      createdAt: 'desc', \/\/ Azalan s\u0131ra (en yeni en ba\u015fta)\n    },\n  });\n  console.log('En Son Olu\u015fturulan G\u00f6nderiler:', latestPosts);\n}<\/code><\/pre>\n<\/div>\n<p>Birden fazla s\u0131ralama kriteri de belirleyebilirsiniz:<\/p>\n<div class=\"code-container\">\n<pre><code>async function getMultiOrderedPosts() {\n  const posts = await prisma.post.findMany({\n    orderBy: [\n      { published: 'desc' }, \/\/ \u00d6nce yay\u0131nlanm\u0131\u015f olanlar\n      { createdAt: 'desc' }, \/\/ Sonra en yeniler\n    ],\n  });\n  console.log('\u00c7oklu S\u0131ralamal\u0131 G\u00f6nderiler:', posts);\n}<\/code><\/pre>\n<\/div>\n<h3>Sayfalama (Pagination)<\/h3>\n<p>B\u00fcy\u00fck veri k\u00fcmelerini y\u00f6netmek i\u00e7in sayfalama, kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir. Prisma, <code>skip<\/code> (atla) ve <code>take<\/code> (al) se\u00e7enekleriyle kolayca sayfalama yapman\u0131z\u0131 sa\u011flar:<\/p>\n<div class=\"code-container\">\n<pre><code>async function getPaginatedPosts(page: number, pageSize: number) {\n  const skip = (page - 1) * pageSize;\n  const take = pageSize;\n\n  const posts = await prisma.post.findMany({\n    skip: skip,\n    take: take,\n    orderBy: {\n      createdAt: 'desc',\n    },\n  });\n\n  const totalPosts = await prisma.post.count(); \/\/ Toplam g\u00f6nderi say\u0131s\u0131n\u0131 al\n  console.log(<code>Sayfa ${page}, ${pageSize} g\u00f6nderi:<\/code>, posts);\n  console.log(<code>Toplam G\u00f6nderi Say\u0131s\u0131: ${totalPosts}<\/code>);\n  return { posts, totalPosts };\n}\n\n\/\/ \u00d6rnek kullan\u0131m: 2. sayfadaki 5 g\u00f6nderiyi \u00e7ek\n\/\/ getPaginatedPosts(2, 5);<\/code><\/pre>\n<\/div>\n<p>Bu y\u00f6ntem, &#8220;offset-based pagination&#8221; olarak bilinir. Kullan\u0131c\u0131 aray\u00fczlerinde &#8220;Sonraki Sayfa&#8221; veya &#8220;\u00d6nceki Sayfa&#8221; butonlar\u0131n\u0131 uygulamak i\u00e7in idealdir. <code>prisma.model.count()<\/code> metodu ise toplam kay\u0131t say\u0131s\u0131n\u0131 alarak sayfa numaralar\u0131n\u0131 veya toplam sayfa say\u0131s\u0131n\u0131 hesaplaman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<h3>\u0130leri D\u00fczey Kullan\u0131m: Ham SQL Sorgular\u0131 (<code>$queryRaw<\/code>, <code>$executeRaw<\/code>)<\/h3>\n<p>Prisma&#8217;n\u0131n g\u00fc\u00e7l\u00fc ORM yeteneklerine ra\u011fmen, bazen \u00e7ok \u00f6zel veya optimize edilmi\u015f ham SQL sorgular\u0131 \u00e7al\u0131\u015ft\u0131rman\u0131z gerekebilir. Prisma, bu t\u00fcr durumlar i\u00e7in <code>$queryRaw<\/code> ve <code>$executeRaw<\/code> metotlar\u0131n\u0131 sunar. Bu metotlar, Prisma Client arac\u0131l\u0131\u011f\u0131yla tip-g\u00fcvenli bir \u015fekilde ham SQL sorgular\u0131 \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131r.<\/p>\n<ul>\n<li><strong><code>$queryRaw<\/code>:<\/strong> Veritaban\u0131ndan veri d\u00f6nd\u00fcren <code>SELECT<\/code> gibi sorgular i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><strong><code>$executeRaw<\/code>:<\/strong> Veritaban\u0131nda de\u011fi\u015fiklik yapan <code>INSERT<\/code>, <code>UPDATE<\/code>, <code>DELETE<\/code> gibi sorgular i\u00e7in kullan\u0131l\u0131r ve etkilenen sat\u0131r say\u0131s\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr.<\/li>\n<\/ul>\n<div class=\"code-container\">\n<pre><code>async function runRawQuery() {\n  \/\/ Ham SQL ile belirli bir kullan\u0131c\u0131n\u0131n e-postas\u0131n\u0131 \u00e7ekme\n  const result = await prisma.$queryRaw<code>SELECT email FROM &quot;User&quot; WHERE id = ${1};<\/code>;\n  console.log('Ham Sorgu Sonucu:', result);\n\n  \/\/ Ham SQL ile bir kullan\u0131c\u0131n\u0131n ad\u0131n\u0131 g\u00fcncelleme\n  const updatedCount = await prisma.$executeRaw<code>UPDATE &quot;User&quot; SET name = ${&#039;Ham SQL ile G\u00fcncellendi&#039;} WHERE id = ${1};<\/code>;\n  console.log(<code>${updatedCount} sat\u0131r g\u00fcncellendi.<\/code>);\n}<\/code><\/pre>\n<\/div>\n<p>Bu metotlar\u0131 kullan\u0131rken, SQL enjeksiyon riskini \u00f6nlemek i\u00e7in parametreli sorgu s\u00f6zdizimini (yukar\u0131daki \u00f6rnekte <code>${variable}<\/code>) kullanmak hayati \u00f6nem ta\u015f\u0131r. Prisma, bu parametreleri g\u00fcvenli bir \u015fekilde i\u015fleyerek olas\u0131 sald\u0131r\u0131lar\u0131 engeller. Bu sayede, Prisma&#8217;n\u0131n genel tip g\u00fcvenli\u011fi ve kullan\u0131m kolayl\u0131\u011f\u0131ndan \u00f6d\u00fcn vermeden, gerekti\u011finde ham SQL&#8217;in g\u00fcc\u00fcnden faydalanabilirsiniz.<\/p>\n<h3>Transaction Y\u00f6netimi<\/h3>\n<p>Birden fazla veritaban\u0131 i\u015fleminin atomik (ya hep ya hi\u00e7) bir \u015fekilde ger\u00e7ekle\u015fmesini sa\u011flamak i\u00e7in transaction&#8217;lar (i\u015flemler) kullan\u0131l\u0131r. Prisma, <code>$transaction<\/code> metodu ile transaction y\u00f6netimini basitle\u015ftirir:<\/p>\n<div class=\"code-container\">\n<pre><code>async function createPostAndUserInTransaction() {\n  try {\n    const [newUser, newPost] = await prisma.$transaction([\n      prisma.user.create({ data: { email: 'transaction@example.com', name: 'Transaction User' } }),\n      prisma.post.create({ data: { title: 'Transaction Post', content: 'This is a post from a transaction.', published: true, author: { connect: { email: 'transaction@example.com' } } } }),\n    ]);\n    console.log('Transaction ba\u015far\u0131l\u0131:', newUser, newPost);\n  } catch (error) {\n    console.error('Transaction ba\u015far\u0131s\u0131z oldu, geri al\u0131nd\u0131:', error);\n  }\n}<\/code><\/pre>\n<\/div>\n<p>Bu \u00f6rnekte, hem yeni bir kullan\u0131c\u0131 olu\u015fturuluyor hem de bu kullan\u0131c\u0131ya ait bir g\u00f6nderi ekleniyor. E\u011fer i\u015flemlerden biri ba\u015far\u0131s\u0131z olursa, her ikisi de geri al\u0131n\u0131r ve veritaban\u0131 tutarl\u0131 kal\u0131r.<\/p>\n<p>Prisma&#8217;n\u0131n sundu\u011fu bu geli\u015fmi\u015f sorgulama, sayfalama, filtreleme ve transaction y\u00f6netimi yetenekleri, modern uygulamalar\u0131n karma\u015f\u0131k veri ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lamak i\u00e7in geli\u015ftiricilere kapsaml\u0131 bir ara\u00e7 seti sunar. Bu \u00f6zellikler sayesinde, veritaban\u0131 etkile\u015fimi daha verimli, g\u00fcvenli ve y\u00f6netilebilir hale gelir.<\/p>\n<h2>Prisma ORM ile Uygulaman\u0131zda Nas\u0131l Bir D\u00f6n\u00fc\u015f\u00fcm Ya\u015fars\u0131n\u0131z?<\/h2>\n<p>Prisma ORM&#8217;i bir projeye entegre etmek, sadece veritaban\u0131 sorgulama \u015feklinizi de\u011fi\u015ftirmekle kalmaz, ayn\u0131 zamanda t\u00fcm geli\u015ftirme s\u00fcrecinizde ve uygulaman\u0131z\u0131n genel sa\u011fl\u0131\u011f\u0131nda \u00f6nemli bir d\u00f6n\u00fc\u015f\u00fcm yarat\u0131r. Ham SQL&#8217;den Prisma&#8217;ya ge\u00e7i\u015fin getirdi\u011fi bu d\u00f6n\u00fc\u015f\u00fcm, hem geli\u015ftirme h\u0131z\u0131 hem de uygulaman\u0131n uzun vadeli s\u00fcrd\u00fcr\u00fclebilirli\u011fi a\u00e7\u0131s\u0131ndan kayda de\u011fer faydalar sunar.<\/p>\n<h3>Geli\u015ftirme H\u0131z\u0131 ve Hata Azaltma<\/h3>\n<p>Prisma&#8217;n\u0131n en belirgin faydalar\u0131ndan biri, <strong>geli\u015ftirme h\u0131z\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rmas\u0131d\u0131r<\/strong>. Otomatik olarak \u00fcretilen tip-g\u00fcvenli Prisma Client sayesinde, veritaban\u0131 etkile\u015fimleri i\u00e7in manuel SQL sorgular\u0131 yazma, parametreleri elle ba\u011flama ve veri e\u015fleme gibi tekrarlayan ve zaman al\u0131c\u0131 g\u00f6revlerden kurtulursunuz. TypeScript ile tam entegrasyonu, IDE&#8217;nizin (Entegre Geli\u015ftirme Ortam\u0131) otomatik tamamlama (autocomplete) \u00f6zelliklerini kullanarak \u00e7ok daha h\u0131zl\u0131 kod yazman\u0131z\u0131 sa\u011flar. Bu, \u00f6zellikle yeni \u00f6zellikler geli\u015ftirirken veya mevcut kodda de\u011fi\u015fiklik yaparken zaman kazand\u0131r\u0131r.<\/p>\n<div class=\"code-container\">\n<pre><code>\/\/ Ham SQL ile kullan\u0131c\u0131 \u00e7ekme (\u00f6rnek)\n\/\/ const user = await db.query('SELECT * FROM users WHERE id = $1', [userId]);\n\/\/ return { id: user.rows[0].id, email: user.rows[0].email, ... };\n\n\/\/ Prisma ile kullan\u0131c\u0131 \u00e7ekme\nconst user = await prisma.user.findUnique({ where: { id: userId } });\n\/\/ user nesnesi do\u011frudan tip-g\u00fcvenli olarak gelir, manuel e\u015flemeye gerek yok.<\/code><\/pre>\n<\/div>\n<p>Bu h\u0131z art\u0131\u015f\u0131n\u0131n yan\u0131 s\u0131ra, <strong>hata oranlar\u0131nda da ciddi bir azalma g\u00f6r\u00fcl\u00fcr<\/strong>. Ham SQL sorgular\u0131ndaki yaz\u0131m hatalar\u0131, yanl\u0131\u015f alan adlar\u0131 veya tip uyu\u015fmazl\u0131klar\u0131 genellikle \u00e7al\u0131\u015fma zaman\u0131nda (runtime) ortaya \u00e7\u0131kar ve hata ay\u0131klamas\u0131 (debugging) zor olabilir. Prisma&#8217;n\u0131n tip g\u00fcvenli\u011fi sayesinde, bu t\u00fcr hatalar\u0131n \u00e7o\u011fu daha kod yaz\u0131l\u0131rken veya derleme zaman\u0131nda yakalan\u0131r. Bu, uygulaman\u0131z\u0131n daha kararl\u0131 ve g\u00fcvenilir olmas\u0131n\u0131 sa\u011flar, \u00fcretim ortam\u0131nda kar\u015f\u0131la\u015faca\u011f\u0131n\u0131z beklenmedik hatalar\u0131 en aza indirir.<\/p>\n<h3>Bak\u0131m Kolayl\u0131\u011f\u0131 ve Ekip Verimlili\u011fi<\/h3>\n<p>Uygulamalar b\u00fcy\u00fcd\u00fck\u00e7e, kodun bak\u0131m\u0131 ve g\u00fcncellenmesi giderek zorla\u015f\u0131r. Prisma, bu konuda da \u00f6nemli avantajlar sunar. <strong>Veritaban\u0131 \u015femas\u0131n\u0131n tek bir merkezi yerde (<code>schema.prisma<\/code>) tan\u0131mlanmas\u0131<\/strong>, hem veritaban\u0131 yap\u0131s\u0131n\u0131 anlamay\u0131 kolayla\u015ft\u0131r\u0131r hem de \u015fema de\u011fi\u015fikliklerinin y\u00f6netimini basitle\u015ftirir. Bir s\u00fctun ad\u0131 de\u011fi\u015fti\u011finde veya yeni bir model eklendi\u011finde, Prisma Migrate ara\u00e7lar\u0131 bu de\u011fi\u015fiklikleri veritaban\u0131na sorunsuz bir \u015fekilde uygular ve Prisma Client&#8217;\u0131 g\u00fcncelleyerek uygulama kodunuzun da otomatik olarak g\u00fcncellenen tiplere sahip olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Bu merkezi \u015fema y\u00f6netimi ve otomatik tip \u00fcretimi, \u00f6zellikle <strong>b\u00fcy\u00fck ekiplerde verimlili\u011fi art\u0131r\u0131r<\/strong>. Geli\u015ftiriciler, veritaban\u0131 \u015femas\u0131 hakk\u0131nda s\u00fcrekli endi\u015felenmek yerine, i\u015f mant\u0131\u011f\u0131na odaklanabilirler. Herkesin ayn\u0131, tip-g\u00fcvenli aray\u00fcz \u00fczerinden veritaban\u0131yla etkile\u015fim kurmas\u0131, kod taban\u0131nda tutarl\u0131l\u0131k sa\u011flar ve yeni ekip \u00fcyelerinin projeye adaptasyon s\u00fcrecini h\u0131zland\u0131r\u0131r. Kod incelemeleri (code reviews) daha verimli hale gelir, \u00e7\u00fcnk\u00fc veritaban\u0131 etkile\u015fimlerinin do\u011frulu\u011fu Prisma taraf\u0131ndan garanti alt\u0131na al\u0131nm\u0131\u015ft\u0131r.<\/p>\n<h3>\u00d6l\u00e7eklenebilirlik ve Performans De\u011ferlendirmesi<\/h3>\n<p>Prisma&#8217;n\u0131n mimarisi, y\u00fcksek performans ve \u00f6l\u00e7eklenebilirlik g\u00f6z \u00f6n\u00fcnde bulundurularak tasarlanm\u0131\u015ft\u0131r. Di\u011fer ORM&#8217;lerin aksine, Prisma Client do\u011frudan veritaban\u0131na ba\u011flan\u0131r ve sorgular\u0131 optimize edilmi\u015f SQL&#8217;e d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Bu, gereksiz soyutlama katmanlar\u0131n\u0131 ortadan kald\u0131rarak <strong>daha d\u00fc\u015f\u00fck gecikme s\u00fcresi (latency) ve daha y\u00fcksek verim (throughput)<\/strong> sa\u011flar. Prisma&#8217;n\u0131n &#8220;prepared statements&#8221; (haz\u0131rlanm\u0131\u015f ifadeler) kullanmas\u0131, SQL enjeksiyonuna kar\u015f\u0131 g\u00fcvenlik sa\u011flarken ayn\u0131 zamanda sorgu performans\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<p>Ancak, her ORM gibi, Prisma&#8217;n\u0131n da baz\u0131 durumlarda manuel olarak optimize edilmi\u015f SQL sorgular\u0131ndan biraz daha yava\u015f \u00e7al\u0131\u015fabilece\u011fi durumlar olabilir. Bu t\u00fcr senaryolar genellikle \u00e7ok karma\u015f\u0131k raporlama sorgular\u0131 veya b\u00fcy\u00fck veri k\u00fcmeleri \u00fczerinde yo\u011fun analiz gerektiren i\u015flemlerdir. Bu gibi durumlarda, Prisma&#8217;n\u0131n <code>$queryRaw<\/code> ve <code>$executeRaw<\/code> metotlar\u0131 devreye girer. Geli\u015ftiriciler, gerekti\u011finde ham SQL&#8217;in g\u00fcc\u00fcnden faydalanarak performans darbo\u011fazlar\u0131n\u0131 a\u015fabilirler. Bu esneklik, Prisma&#8217;y\u0131 hem h\u0131zl\u0131 geli\u015ftirme hem de performans odakl\u0131 uygulamalar i\u00e7in uygun bir \u00e7\u00f6z\u00fcm haline getirir.<\/p>\n<h3>Ger\u00e7ek D\u00fcnya Senaryosu: Bir Startup&#8217;\u0131n Prisma&#8217;ya Ge\u00e7i\u015fi<\/h3>\n<p>Bir e-ticaret startup&#8217;\u0131 d\u00fc\u015f\u00fcnelim. Ba\u015flang\u0131\u00e7ta, k\u00fc\u00e7\u00fck bir ekip ham SQL sorgular\u0131 kullanarak \u00fcr\u00fcn kataloglar\u0131n\u0131, kullan\u0131c\u0131lar\u0131n\u0131 ve sipari\u015flerini y\u00f6netiyordu. Proje b\u00fcy\u00fcd\u00fck\u00e7e, yeni \u00f6zellikler eklemek, SQL enjeksiyonu endi\u015feleriyle ba\u015fa \u00e7\u0131kmak ve veritaban\u0131 \u015femas\u0131ndaki de\u011fi\u015fiklikleri t\u00fcm sorgulara yans\u0131tmak ciddi bir ba\u015f a\u011fr\u0131s\u0131 haline geldi. Geli\u015ftiriciler, s\u00fcrekli olarak SQL sorgular\u0131n\u0131 test etmek ve manuel veri e\u015fleme hatalar\u0131n\u0131 ay\u0131klamakla zaman kaybediyordu.<\/p>\n<p>Prisma ORM&#8217;e ge\u00e7i\u015f yapmaya karar verdiklerinde, ilk olarak mevcut veritaban\u0131 \u015femalar\u0131n\u0131 Prisma modellerine d\u00f6n\u00fc\u015ft\u00fcrd\u00fcler. Prisma Migrate ile migrasyonlar\u0131 y\u00f6netmeye ba\u015flad\u0131lar. Bu ge\u00e7i\u015fin ard\u0131ndan, geli\u015ftiriciler \u015fu faydalar\u0131 g\u00f6zlemledi:<\/p>\n<ul>\n<li><strong>H\u0131zlanan Geli\u015ftirme:<\/strong> Yeni \u00fcr\u00fcn ekleme, sipari\u015f detaylar\u0131n\u0131 \u00e7ekme gibi i\u015flemler i\u00e7in saatler s\u00fcren SQL yazma ve test etme s\u00fcre\u00e7leri, dakikalara indi. Otomatik tamamlama sayesinde, veritaban\u0131 alan adlar\u0131n\u0131 hat\u0131rlama derdi kalmad\u0131.<\/li>\n<li><strong>Azalan Hata Oran\u0131:<\/strong> \u00d6zellikle tip uyu\u015fmazl\u0131\u011f\u0131 ve yanl\u0131\u015f alan ad\u0131 kullan\u0131m\u0131 kaynakl\u0131 hatalar, derleme zaman\u0131nda yakaland\u0131\u011f\u0131 i\u00e7in \u00fcretim ortam\u0131nda neredeyse s\u0131f\u0131ra indi.<\/li>\n<li><strong>Kolay Bak\u0131m:<\/strong> \u00dcr\u00fcn modeline yeni bir \u00f6zellik (\u00f6rne\u011fin &#8220;stok adedi&#8221;) eklendi\u011finde, sadece <code>schema.prisma<\/code> dosyas\u0131n\u0131 g\u00fcncelleyip migrasyon \u00e7al\u0131\u015ft\u0131rmak yeterli oldu. \u0130li\u015fkili t\u00fcm kodlar, Prisma Client&#8217;\u0131n otomatik g\u00fcncellenmesi sayesinde tip-g\u00fcvenli kald\u0131.<\/li>\n<li><strong>Ekip \u0130\u015fbirli\u011fi:<\/strong> Yeni geli\u015ftiricilerin projeye adaptasyonu h\u0131zland\u0131. Veritaban\u0131 \u015femas\u0131 a\u00e7\u0131k ve anla\u015f\u0131l\u0131r bir \u015fekilde tan\u0131mland\u0131\u011f\u0131 i\u00e7in, veritaban\u0131 yap\u0131s\u0131n\u0131 anlamak i\u00e7in saatler harcamak yerine do\u011frudan i\u015f mant\u0131\u011f\u0131na odaklanabildiler.<\/li>\n<\/ul>\n<p>Bu senaryo, Prisma&#8217;n\u0131n bir uygulaman\u0131n ve onu geli\u015ftiren ekibin \u00fczerinde nas\u0131l d\u00f6n\u00fc\u015ft\u00fcr\u00fcc\u00fc bir etki yaratabilece\u011finin somut bir \u00f6rne\u011fidir. Ham SQL&#8217;in getirdi\u011fi zorluklardan kurtulup, daha modern, g\u00fcvenli ve verimli bir geli\u015ftirme s\u00fcrecine ge\u00e7i\u015f yapmak isteyen her proje i\u00e7in Prisma ORM, g\u00fc\u00e7l\u00fc bir adayd\u0131r.<\/p>\n<h2>Sonu\u00e7: Ham SQL&#8217;den T\u00fcr G\u00fcvenli\u011fine Yolculu\u011funuzda Prisma Neden Yan\u0131n\u0131zda Olmal\u0131?<\/h2>\n<p>Ham SQL sorgular\u0131n\u0131n karma\u015f\u0131kl\u0131\u011f\u0131, g\u00fcvenlik riskleri ve bak\u0131m zorluklar\u0131, modern uygulama geli\u015ftiricileri i\u00e7in uzun y\u0131llard\u0131r s\u00fcregelen bir sorundu. \u00d6zellikle TypeScript gibi tip-g\u00fcvenli dillerin yayg\u0131nla\u015fmas\u0131yla birlikte, veritaban\u0131 etkile\u015fimlerinde de benzer bir g\u00fcvenli\u011fi ve verimlili\u011fi aray\u0131\u015f\u0131na girildi. \u0130\u015fte bu noktada, Prisma ORM, geli\u015ftiricilerin bu aray\u0131\u015f\u0131na g\u00fc\u00e7l\u00fc ve kapsaml\u0131 bir yan\u0131t sunarak, ham SQL&#8217;den t\u00fcr g\u00fcvenli\u011fine do\u011fru yap\u0131lan yolculukta vazge\u00e7ilmez bir ara\u00e7 haline gelmi\u015ftir.<\/p>\n<p>Prisma&#8217;n\u0131n sundu\u011fu temel avantajlar\u0131 \u00f6zetlemek gerekirse:<\/p>\n<ul>\n<li><strong>Tip G\u00fcvenli\u011fi:<\/strong> TypeScript ile tam entegrasyonu sayesinde, veritaban\u0131 sorgular\u0131n\u0131zda derleme zaman\u0131 tip kontrol\u00fc sa\u011flar, hatalar\u0131 \u00e7al\u0131\u015fma zaman\u0131na ta\u015f\u0131madan \u00f6nce yakalaman\u0131za yard\u0131mc\u0131 olur.<\/li>\n<li><strong>Geli\u015ftirici Deneyimi (DX):<\/strong> Sezgisel API&#8217;si, otomatik tamamlama \u00f6zellikleri ve kolay okunabilir sorgu yap\u0131s\u0131 ile geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r ve daha keyifli hale getirir.<\/li>\n<li><strong>Schema-First Yakla\u015f\u0131m:<\/strong> Veritaban\u0131 \u015feman\u0131z\u0131 tek bir merkezi dosyada (<code>schema.prisma<\/code>) tan\u0131mlaman\u0131za olanak tan\u0131r. Bu, hem veritaban\u0131 yap\u0131s\u0131n\u0131 anlamay\u0131 hem de migrasyonlar\u0131 y\u00f6netmeyi basitle\u015ftirir.<\/li>\n<li><strong>G\u00fcvenlik:<\/strong> Parametreli sorgular\u0131 otomatik olarak kullanarak SQL enjeksiyonu gibi yayg\u0131n g\u00fcvenlik a\u00e7\u0131klar\u0131na kar\u015f\u0131 koruma sa\u011flar.<\/li>\n<li><strong>Performans:<\/strong> Do\u011frudan veritaban\u0131na ba\u011flanma ve optimize edilmi\u015f SQL \u00fcretme yetene\u011fi sayesinde y\u00fcksek performans sunar. Gerekti\u011finde ham SQL sorgular\u0131na da izin vererek esneklik sa\u011flar.<\/li>\n<li><strong>Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> Kod tekrar\u0131n\u0131 azalt\u0131r, veritaban\u0131 \u015femas\u0131 de\u011fi\u015fikliklerini kolayca y\u00f6netmenizi sa\u011flar ve uygulaman\u0131z\u0131n uzun vadeli s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Bir e-ticaret uygulamas\u0131n\u0131n geli\u015ftirme s\u00fcrecini h\u0131zland\u0131rmas\u0131ndan, b\u00fcy\u00fck bir ekibin veritaban\u0131 etkile\u015fimlerinde tutarl\u0131l\u0131k sa\u011flamas\u0131na kadar, Prisma ORM&#8217;in ger\u00e7ek d\u00fcnya projelerine katt\u0131\u011f\u0131 de\u011fer ortadad\u0131r. Geli\u015ftiricilerin daha az hata yapmas\u0131n\u0131, daha h\u0131zl\u0131 kod yazmas\u0131n\u0131 ve en \u00f6nemlisi, uygulaman\u0131n i\u015f mant\u0131\u011f\u0131na odaklanmas\u0131n\u0131 sa\u011flayarak, veritaban\u0131 y\u00f6netimini bir y\u00fck olmaktan \u00e7\u0131kar\u0131p bir avantaj haline getirir.<\/p>\n<p>E\u011fer siz de ham SQL sorgular\u0131n\u0131n getirdi\u011fi k\u0131s\u0131tlamalardan s\u0131k\u0131ld\u0131ysan\u0131z ve modern, tip-g\u00fcvenli ve verimli bir veritaban\u0131 etkile\u015fimi ar\u0131yorsan\u0131z, Prisma ORM&#8217;i projenize dahil etmek, atabilece\u011finiz en iyi ad\u0131mlardan biri olacakt\u0131r. Bu, sadece bug\u00fcn\u00fcn de\u011fil, yar\u0131n\u0131n da gereksinimlerini kar\u015f\u0131layacak, daha sa\u011flam ve \u00f6l\u00e7eklenebilir uygulamalar in\u015fa etmenize yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt>Prisma sadece TypeScript ile mi kullan\u0131l\u0131r?<\/dt>\n<dd>Hay\u0131r, Prisma hem TypeScript hem de JavaScript projelerinde kullan\u0131labilir. Ancak, TypeScript ile kullan\u0131ld\u0131\u011f\u0131nda, Prisma&#8217;n\u0131n otomatik olarak \u00fcretti\u011fi tip tan\u0131mlamalar\u0131 sayesinde tam tip g\u00fcvenli\u011finden ve geli\u015ftirici deneyiminden en \u00fcst d\u00fczeyde faydalan\u0131rs\u0131n\u0131z.<\/dd>\n<dt>Prisma hangi veritabanlar\u0131n\u0131 destekler?<\/dt>\n<dd>Prisma; PostgreSQL, MySQL, SQLite, SQL Server ve CockroachDB gibi pop\u00fcler ili\u015fkisel veritabanlar\u0131n\u0131 destekler. Yeni veritaban\u0131 sa\u011flay\u0131c\u0131lar\u0131 i\u00e7in destek s\u00fcrekli olarak geli\u015ftirilmektedir.<\/dd>\n<dt>Prisma&#8217;n\u0131n performans\u0131 nas\u0131ld\u0131r?<\/dt>\n<dd>Prisma, performans\u0131 y\u00fcksek bir ORM&#8217;dir. Do\u011frudan veritaban\u0131na ba\u011flan\u0131r, optimize edilmi\u015f SQL sorgular\u0131 \u00fcretir ve &#8220;prepared statements&#8221; kullan\u0131r. Bu sayede \u00e7o\u011fu senaryoda manuel yaz\u0131lm\u0131\u015f SQL sorgular\u0131na yak\u0131n veya e\u015fit performans sunar. \u00c7ok \u00f6zel durumlarda, <code>$queryRaw<\/code> veya <code>$executeRaw<\/code> metotlar\u0131 ile ham SQL \u00e7al\u0131\u015ft\u0131rarak performans\u0131 daha da optimize edebilirsiniz.<\/dd>\n<dt>Prisma ile ham SQL sorgular\u0131 \u00e7al\u0131\u015ft\u0131rabilir miyim?<\/dt>\n<dd>Evet, Prisma, <code>$queryRaw<\/code> ve <code>$executeRaw<\/code> metotlar\u0131 arac\u0131l\u0131\u011f\u0131yla ham SQL sorgular\u0131 \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131r. Bu, ORM&#8217;in yetersiz kald\u0131\u011f\u0131 veya \u00f6zel optimizasyon gerektiren durumlar i\u00e7in b\u00fcy\u00fck bir esneklik sa\u011flar. Ancak, SQL enjeksiyonu riskini \u00f6nlemek i\u00e7in bu metotlar\u0131 kullan\u0131rken parametreli sorgu s\u00f6zdizimine dikkat etmeniz \u00f6nemlidir.<\/dd>\n<dt>Prisma \u00f6\u011frenmesi zor bir ORM midir?<\/dt>\n<dd>Prisma&#8217;n\u0131n temel kavramlar\u0131 (schema tan\u0131mlama, modelleme, temel CRUD) olduk\u00e7a sezgisel ve kolay \u00f6\u011frenilebilir. \u00d6zellikle TypeScript kullan\u0131c\u0131lar\u0131 i\u00e7in sundu\u011fu tip g\u00fcvenli\u011fi ve otomatik tamamlama, \u00f6\u011frenme s\u00fcrecini h\u0131zland\u0131r\u0131r. Karma\u015f\u0131k ili\u015fkiler ve geli\u015fmi\u015f sorgulama teknikleri biraz pratik gerektirse de, genel olarak di\u011fer ORM&#8217;lere g\u00f6re daha modern ve kullan\u0131c\u0131 dostu bir \u00f6\u011frenme e\u011frisine sahiptir.<\/dd>\n<\/dl>\n<p>#PrismaORM #Veritaban\u0131Y\u00f6netimi #TypeScript #WebGeli\u015ftirme #SQL<\/p>\n","protected":false},"excerpt":{"rendered":"Modern web uygulamalar\u0131 geli\u015ftirirken veritaban\u0131 etkile\u015fimi, \u00e7o\u011fu zaman geli\u015ftiricilerin kar\u015f\u0131la\u015ft\u0131\u011f\u0131 en karma\u015f\u0131k ve hata potansiyeli y\u00fcksek alanlardan biri olmu\u015ftur.","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":[1505],"tags":[],"class_list":{"0":"post-42367","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-sql-2","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>Ham SQL Sorgular\u0131ndan T\u00fcr G\u00fcvenli\u011fine: Prisma ORM ile Tan\u0131\u015fma Hikayem - 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\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ham SQL Sorgular\u0131ndan T\u00fcr G\u00fcvenli\u011fine: Prisma ORM ile Tan\u0131\u015fma Hikayem\" \/>\n<meta property=\"og:description\" content=\"Modern web uygulamalar\u0131 geli\u015ftirirken veritaban\u0131 etkile\u015fimi, \u00e7o\u011fu zaman geli\u015ftiricilerin kar\u015f\u0131la\u015ft\u0131\u011f\u0131 en karma\u015f\u0131k ve hata potansiyeli y\u00fcksek alanlardan biri olmu\u015ftur.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-07T18:08:00+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=\"34 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Ham SQL Sorgular\u0131ndan T\u00fcr G\u00fcvenli\u011fine: Prisma ORM ile Tan\u0131\u015fma Hikayem\",\"datePublished\":\"2026-06-07T18:08:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/\"},\"wordCount\":5547,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"SQL\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/\",\"name\":\"Ham SQL Sorgular\u0131ndan T\u00fcr G\u00fcvenli\u011fine: Prisma ORM ile Tan\u0131\u015fma Hikayem - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-06-07T18:08:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ham SQL Sorgular\u0131ndan T\u00fcr G\u00fcvenli\u011fine: Prisma ORM ile Tan\u0131\u015fma Hikayem\"}]},{\"@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":"Ham SQL Sorgular\u0131ndan T\u00fcr G\u00fcvenli\u011fine: Prisma ORM ile Tan\u0131\u015fma Hikayem - 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\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/","og_locale":"tr_TR","og_type":"article","og_title":"Ham SQL Sorgular\u0131ndan T\u00fcr G\u00fcvenli\u011fine: Prisma ORM ile Tan\u0131\u015fma Hikayem","og_description":"Modern web uygulamalar\u0131 geli\u015ftirirken veritaban\u0131 etkile\u015fimi, \u00e7o\u011fu zaman geli\u015ftiricilerin kar\u015f\u0131la\u015ft\u0131\u011f\u0131 en karma\u015f\u0131k ve hata potansiyeli y\u00fcksek alanlardan biri olmu\u015ftur.","og_url":"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-06-07T18:08:00+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"34 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Ham SQL Sorgular\u0131ndan T\u00fcr G\u00fcvenli\u011fine: Prisma ORM ile Tan\u0131\u015fma Hikayem","datePublished":"2026-06-07T18:08:00+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/"},"wordCount":5547,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["SQL"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/","url":"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/","name":"Ham SQL Sorgular\u0131ndan T\u00fcr G\u00fcvenli\u011fine: Prisma ORM ile Tan\u0131\u015fma Hikayem - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-06-07T18:08:00+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ham-sql-sorgularindan-tur-guvenligine-prisma-orm-ile-tanisma-hikayem\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ham SQL Sorgular\u0131ndan T\u00fcr G\u00fcvenli\u011fine: Prisma ORM ile Tan\u0131\u015fma Hikayem"}]},{"@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\/42367","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=42367"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42367\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=42367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=42367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=42367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}