<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Abdullah Emiroğlu</title>
    <description>The latest articles on DEV Community by Abdullah Emiroğlu (@abdullahemrgl).</description>
    <link>https://dev.to/abdullahemrgl</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F448200%2F111e587a-1644-4e09-9f12-c4c7ba36c844.jpg</url>
      <title>DEV Community: Abdullah Emiroğlu</title>
      <link>https://dev.to/abdullahemrgl</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abdullahemrgl"/>
    <language>en</language>
    <item>
      <title>Python ORM: Peewee</title>
      <dc:creator>Abdullah Emiroğlu</dc:creator>
      <pubDate>Sat, 04 Feb 2023 21:17:55 +0000</pubDate>
      <link>https://dev.to/abdullahemrgl/python-orm-peewee-4in6</link>
      <guid>https://dev.to/abdullahemrgl/python-orm-peewee-4in6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Not:&lt;/strong&gt; SQLAlchemy tabanlı &lt;a href="https://sqlmodel.tiangolo.com/" rel="noopener noreferrer"&gt;SQLModel&lt;/a&gt;'ı incelemek isteyebilirsiniz.&lt;/p&gt;

&lt;p&gt;Resmi belge için: &lt;a href="http://docs.peewee-orm.com/en/latest/index.html" rel="noopener noreferrer"&gt;Peewee Docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aşağıdaki kavramları/teknolojileri &lt;em&gt;en azından&lt;/em&gt; &lt;strong&gt;temel seviyede&lt;/strong&gt; bildiğinizi varsayıyorum:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Komut Satırı (basit dosya/dizin işlemleri seviyesinde)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://python-istihza.yazbel.com/" rel="noopener noreferrer"&gt;Python Programlama Dili&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.w3schools.com/python/python_classes.asp" rel="noopener noreferrer"&gt;Nesne Tabanlı Programlama&lt;/a&gt; (class, instance ve object seviyesinde)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sqlmodel.tiangolo.com/databases/" rel="noopener noreferrer"&gt;İlişkisel Veritabanı&lt;/a&gt; (anlamanızı kolaylaşırır)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;p&gt;Bu yazıda, dilim döndüğünce, bilgim ölçüsünde Python için &lt;strong&gt;kolay&lt;/strong&gt; ama &lt;strong&gt;etkili&lt;/strong&gt; bir &lt;a href="https://www.kadinyazilimci.com/ormobject-relational-mapping-nedir/" rel="noopener noreferrer"&gt;ORM&lt;/a&gt; olan Peewee'ye hızlı bir giriş yapıyoruz.&lt;/p&gt;

&lt;p&gt;Yazı boyunca, &lt;strong&gt;kitaplık veritabanı&lt;/strong&gt; (&lt;a href="https://github.com/abdullahemrgl/kitaplik" rel="noopener noreferrer"&gt;Github&lt;/a&gt;) oluşturarak Peewee'nin temel özelliklerini bu örnek üzerinden görmüş olacağız, umarım faydalı olur.&lt;/p&gt;

&lt;p&gt;İçerik:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Neden Peewee?&lt;/li&gt;
&lt;li&gt;Senaryo&lt;/li&gt;
&lt;li&gt;Hazırlık&lt;/li&gt;
&lt;li&gt;Kurulum&lt;/li&gt;
&lt;li&gt;Veritabanı Tanımlama&lt;/li&gt;
&lt;li&gt;Tabloları Modelleme&lt;/li&gt;
&lt;li&gt;CRUD İşlemleri&lt;/li&gt;
&lt;li&gt;JOIN İşlemleri&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  NEDEN PEEWEE?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Kolay;&lt;/em&gt;&lt;/strong&gt; öğrenme eğrisi düşük.&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Yeterli konsept;&lt;/em&gt;&lt;/strong&gt; sahip olduğu konseptler, muhtemelen işinizi görecek kadar yeterli.&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Başlangıç için ideal;&lt;/em&gt;&lt;/strong&gt; ORM mantığını kavramak ve kısa zaman içerisinde elle tutulur çalışmalar ortaya çıkarmak mümkün. Bu, motivasyonu arttırabilir.&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Bilinir;&lt;/em&gt;&lt;/strong&gt; Python camiasında bilinen bir ORM, yani bir şekilde destek bulursunuz. (Fakat popüler değil)&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Türkçe kaynak katkısı&lt;/em&gt;&lt;/strong&gt; yapmayı amaçladım.&lt;/p&gt;
&lt;h1&gt;
  
  
  SENARYO
&lt;/h1&gt;

&lt;p&gt;Modellerimiz (Veritabanı Tablolarımız):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kitap&lt;/li&gt;
&lt;li&gt;Okuyucu&lt;/li&gt;
&lt;li&gt;OkunanKitap&lt;/li&gt;
&lt;li&gt;Yazar&lt;/li&gt;
&lt;li&gt;KitapDetay&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ulaşmak istediğimiz bazı veriler:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kitap listesi.&lt;/li&gt;
&lt;li&gt;Kitabı okuyanlar kimler?&lt;/li&gt;
&lt;li&gt;Okuyucu listesi ve her birinin kaç kitap okuduğu.&lt;/li&gt;
&lt;li&gt;Okuyucu hangi kitapları okudu?&lt;/li&gt;
&lt;li&gt;Kitap bilgileri.&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  HAZIRLIK
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hatırlatma!&lt;/strong&gt; &lt;br&gt;
Windows kullanıcıları &lt;code&gt;python3&lt;/code&gt; yerine, &lt;code&gt;py&lt;/code&gt; kullanmalıdır.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Komut satırını başlatıyoruz...&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kitaplik&lt;/code&gt; isminde bir &lt;strong&gt;dizin/klasör&lt;/strong&gt; oluşturup, geçiş yapalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir kitaplik
cd kitaplik
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  KURULUM
&lt;/h1&gt;

&lt;p&gt;Python Paket Yöneticisi (PIP) ile kurmak için:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip3 install peewee
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sanal Ortama Kurulum | Bu adımı geç
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Önemli!&lt;/strong&gt; Bazı GNU/Linux dağıtımlarında &lt;code&gt;python3-venv&lt;/code&gt; tarzı bir paket kurmak gerekebiliyor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;1) Sanal ortamı oluşturalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python3 -m venv env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hatırlatma!&lt;/strong&gt; &lt;br&gt;
"env" yerine istediğiniz bir ismi de yazabilirsiniz (ör: sanal_peewe.) Bir sonraki adımda &lt;strong&gt;env&lt;/strong&gt; yerine &lt;strong&gt;belirlediğiniz ismi&lt;/strong&gt; yazmanız gerekir.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;2) Sanal ortamı aktif hale getirelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;source env/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hatırlatma!&lt;/strong&gt; Eğer Windows kullanıyorsanız şu komutu vermelisiniz:&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;env\Scripts\activate.bat
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;3) Paket yöneticimizi (PIP) güncelleyelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python3 -m pip install --upgrade pip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4) Ve kurulum komutumuzu verelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python3 -m pip install peewee
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Böylece &lt;em&gt;kitaplik&lt;/em&gt; klasörümüze sanal ortamımızı, sanal ortamımıza da Peewee'yi kurmuş olduk.&lt;/p&gt;

&lt;p&gt;5) Kontrol edelim:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F410teefqutqzp103ibe0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F410teefqutqzp103ibe0.png" alt="GNU/Linux üzerinde komut satırı" width="558" height="52"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h1&gt;
  
  
  VERİTABANI TANIMLAMA &lt;a&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Kodlamaya başlıyoruz...&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;0) &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;VS Code&lt;/a&gt; kullanıyorsak editörümüzü, &lt;em&gt;"kitaplik"&lt;/em&gt; dizinimiz üzerinde başlatalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;code .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;1) &lt;code&gt;models.py&lt;/code&gt; isminde bir dosya oluşturalım ve açalım.&lt;/p&gt;

&lt;p&gt;2) &lt;code&gt;peewee&lt;/code&gt; modülünü &lt;code&gt;pw&lt;/code&gt; olarak kullanmak üzere &lt;code&gt;models.py&lt;/code&gt; dosyamıza tanımlayalım/aktaralım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import peewee as pw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3) Veritabanımızı tanımlayalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import peewee as pw

db = pw.SqliteDatabase("kitaplik.db")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Ek bilgi&lt;/strong&gt;&lt;br&gt;
Veritabanını &lt;strong&gt;açmak&lt;/strong&gt; için &lt;code&gt;db.connect()&lt;/code&gt;, &lt;strong&gt;kapatmak&lt;/strong&gt; için &lt;code&gt;db.close()&lt;/code&gt; kullanabiliriz.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  TABLOLARI MODELLEME
&lt;/h1&gt;

&lt;p&gt;Peewee'de &lt;a href="https://www.oracle.com/tr/database/what-is-a-relational-database/" rel="noopener noreferrer"&gt;ilişkisel veritabanı&lt;/a&gt;na karşılık gelen kavramlar şu şekildedir:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kavram&lt;/th&gt;
&lt;th&gt;Karşılığı&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Model Sınıfı (Model Class)&lt;/td&gt;
&lt;td&gt;Veritabanı Tablosu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kolon/Alan Örneği (Field Instance)&lt;/td&gt;
&lt;td&gt;Veritabanı Tablo Kolonu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model Örneği (Model Instance)&lt;/td&gt;
&lt;td&gt;Veritabanı Tablo Satırı&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Şimdi, yukarıdaki bilgileri senaryomuz üzerinde görelim.&lt;/p&gt;

&lt;p&gt;İlişkisel veritabanında &lt;em&gt;"kitap"&lt;/em&gt;, &lt;em&gt;"okuyucu"&lt;/em&gt; ve &lt;em&gt;"okunan_kitap"&lt;/em&gt; isimli tablolar oluşturmanın Peewee'deki karşılığı şu şekilde olur:&lt;/p&gt;

&lt;p&gt;1) Tablomuzu &lt;code&gt;peewee.Model&lt;/code&gt; sınıfından türeterek, sınıf olarak tanımlarız:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Kitap(pw.Model):
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Ek bilgi&lt;/strong&gt;&lt;br&gt;
Şu güncellemeyi incelemek isteyebilirsiniz: &lt;a href="https://github.com/coleifer/peewee/releases/tag/3.15.4" rel="noopener noreferrer"&gt;3.15.4&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;2) Kolonlarımızı/Alanlarımızı &lt;code&gt;peewee.NameField&lt;/code&gt; sınıflarını kullanarak tanımlarız:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Kitap(pw.Model):
    isim = pw.CharField(max_length=250, null=False, unique=True)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yukarıda &lt;code&gt;isim&lt;/code&gt; kolonu/alanı;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;En fazla 250 karakter olabilir.&lt;/li&gt;
&lt;li&gt;Boş olamaz.&lt;/li&gt;
&lt;li&gt;Tekrar edemez (benzersiz olmalıdır.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;3) Modelimizin &lt;strong&gt;hangi veritabanını&lt;/strong&gt; kullanacağını ve diğer ayarları, alt bir &lt;code&gt;Meta&lt;/code&gt; sınıfı yazarak tanımlarız:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Kitap(pw.Model):
    isim = pw.CharField(max_length=250, null=False, unique=True)

    Class Meta:
        database = db
        legacy_table_names = False
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yukarıda &lt;code&gt;Kitap&lt;/code&gt; modelimiz;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt; isminde ve her kayıtta değeri otomatik olarak &lt;strong&gt;1 er artacak&lt;/strong&gt; bir alan/kolon oluşacak:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;id = pw.IntegerField(primary_key=True)&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Veritabanı olarak -daha önce tanımladığımız- &lt;code&gt;db&lt;/code&gt; değişkenini kullanacak.&lt;/li&gt;
&lt;li&gt;Veritabanında tablo ismi, &lt;code&gt;kucuk_isim&lt;/code&gt; biçiminde oluşacak.&lt;/li&gt;
&lt;/ul&gt;


&lt;/blockquote&gt;

&lt;p&gt;4) Şimdi &lt;code&gt;Okuyucu&lt;/code&gt; modelimizi tanımlayabiliriz.&lt;/p&gt;

&lt;p&gt;Ama öncesinde &lt;code&gt;models.py&lt;/code&gt; dosyamızın baş tarafına &lt;code&gt;Modelimiz&lt;/code&gt; isminde şöyle bir sınıf tanımlayalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import peewee as pw

db = pw.SqlDatabase("kitaplik.db")

class Modelimiz(pw.Model):
    class Meta:
        database = db
        legacy_table_names = False
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kaldığımız yerden devam edelim ve &lt;code&gt;Okuyucu&lt;/code&gt; modelimizi, &lt;code&gt;Modelimiz&lt;/code&gt; sınıfından türeterek tanımlayalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Okuyucu(Modelimiz):
    isim = pw.CharField(max_length=250, null=False, unique=True)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Okuyucu&lt;/code&gt; modelimiz ile, &lt;code&gt;Kitap&lt;/code&gt; modelimiz arasındaki ilişkiyi de tanımlayalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Okuyucu(Modelimiz):
    isim = pw.CharField(max_length=250, null=False, unique=True)
    kitaplar = pw.ManyToManyField(Kitap, backref="okuyucular")

OkunanKitap = Okuyucu.kitaplar.get_through_model()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yukarıda;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Meta&lt;/code&gt; sınıfı yazmamıza gerek kalmadı. Çünkü &lt;code&gt;Modelimiz&lt;/code&gt; sınıfından türeterek tanımladık.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;peewee.ManyToManyField&lt;/code&gt; kullanarak &lt;code&gt;Okuyucu&lt;/code&gt; ve &lt;code&gt;Kitap&lt;/code&gt; arasında &lt;strong&gt;çoka-çok ilişki&lt;/strong&gt; tanımladık. &lt;code&gt;backref&lt;/code&gt; parametresini kullanarak; kitap üzerinden okuyuculara ulaşabilmeyi sağlayan bir &lt;strong&gt;anahtar ifade&lt;/strong&gt; tanımlamış olduk.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;OkunanKitap&lt;/code&gt;, iki model arasındaki ilişki için gereklidir.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Çoka-çok İlişki?&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Çoka-çok ilişki bize şunu söyler; &lt;em&gt;okuyucu&lt;/em&gt;, &lt;strong&gt;birden fazla kitabı&lt;/strong&gt; okumuş olabilir.&lt;/p&gt;

&lt;p&gt;Aynı şekilde &lt;em&gt;kitabı&lt;/em&gt;, &lt;strong&gt;birden fazla okuyucu&lt;/strong&gt; okumuş olabilir.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Ek bilgi&lt;/strong&gt;&lt;br&gt;
Eğer elimizde &lt;em&gt;okuyucu&lt;/em&gt; varsa, &lt;strong&gt;okuduğu kitaplara&lt;/strong&gt; şu şekilde ulaşırız:&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;okuyucu.kitaplar
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Eğer elimizde &lt;em&gt;kitap&lt;/em&gt; varsa, &lt;strong&gt;kitabı okuyanlara&lt;/strong&gt; şu şekilde ulaşırız:&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kitap.okuyucular
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;5) Son olarak &lt;em&gt;modellerimizi veritabanına aktarabilmek&lt;/em&gt; için, &lt;code&gt;models.py&lt;/code&gt; dosyamıza &lt;code&gt;db.create_tables([])&lt;/code&gt; eklememiz gerekiyor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.create_tables([
    Kitap,
    Okuyucu,
    OkunanKitap
])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;models.py&lt;/code&gt; dosyamızın son hali:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqgitqt28wkr8e96xbc72.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqgitqt28wkr8e96xbc72.png" alt="models.py modülü" width="598" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Şimdi &lt;strong&gt;komut satırımıza&lt;/strong&gt; dönelim ve modellerimizi veritabanına aktaralım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python3 models.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  CRUD İŞLEMLERİ &lt;a&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;CRUD?&lt;/em&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;C&lt;/strong&gt;reate - Oluştur/Ekle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;R&lt;/strong&gt;ead - Oku/Seç/Listele&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;U&lt;/strong&gt;pdate - Güncelle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;D&lt;/strong&gt;elete - Sil&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hazırlık
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;crud.py&lt;/code&gt; isminde yeni bir dosya oluşturalım ve içerisine şu şekilde bir yapı tanımlayalım:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5gbcyoqz9wd4nfup8nzw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5gbcyoqz9wd4nfup8nzw.png" alt="crud.py modülü (şablon)" width="395" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Yukarıda;&lt;br&gt;
Sadece istediğimiz &lt;strong&gt;kod bloğunu&lt;/strong&gt; çalıştırabilmek için, dosyamızı &lt;strong&gt;fonksiyon parçalarına&lt;/strong&gt; böldük.   &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Kayıt Ekleme (Create)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;İlk kısım olan, create() fonksiyonumuzu kodluruyoruz...&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1) Kitap ve okuyucu kaydı tanımlayalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k1 = Kitap(isim="Martin Eden")
k1.save()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yukarıda;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Kitap&lt;/code&gt; modelimizden yeni bir &lt;em&gt;kitap örneği&lt;/em&gt; oluşturduk.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;save()&lt;/code&gt; metodu ile kaydımızı gerçekleştirdik.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;2) Bu sefer &lt;code&gt;create&lt;/code&gt; metodu ile &lt;em&gt;okuyucu&lt;/em&gt; kaydı tanımlayalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;o1 = Okuyucu.create(isim="Abdullah")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3) Şimdi de &lt;code&gt;o1&lt;/code&gt;(Abdullah) &lt;strong&gt;okuyucu&lt;/strong&gt;suna, &lt;code&gt;k1&lt;/code&gt;(Martin Eden) kitabını tanımlayalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;o1.kitaplar.add(k1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hatırlatma!&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;Okuyucu&lt;/code&gt; modelimize &lt;code&gt;kitaplar&lt;/code&gt; isminde kolon tanımlamıştık.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;4) İsterseniz &lt;strong&gt;farklı bir yöntem&lt;/strong&gt; kullanarak &lt;em&gt;yeni bir kitap&lt;/em&gt; kaydı tanımlayalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kitap_id = Kitap.insert(isim="Cinayet Alfabesi").execute()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Ek bilgi&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;execute()&lt;/code&gt; metodu, kaydı gerçekleştirir ve &lt;code&gt;int&lt;/code&gt; tipinde benzersiz bir kayıt &lt;code&gt;id&lt;/code&gt; değeri döndürür.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;5) Şimdi &lt;code&gt;Model.get()&lt;/code&gt; kullanarak az önceki kitap kaydımıza ulaşalım.&lt;br&gt;
Ardından &lt;code&gt;o1&lt;/code&gt;(Abdullah) okuyucusuna &lt;code&gt;k2&lt;/code&gt;(Cinayet Alfabesi) kitabımızı tanımlayalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k2 = Kitap.get(Kitap.id == kitap_id)
k2.okuyucular.add(o1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hatırlatma!&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;Okuyucu&lt;/code&gt; modelimizde yer alan &lt;code&gt;kitaplar&lt;/code&gt; kolonunun parametresi, &lt;code&gt;backref="okuyucular"&lt;/code&gt; şeklindeydi.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9y4i0j8ny0b91t9vl75b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9y4i0j8ny0b91t9vl75b.png" alt="crud.py modülünün, create() fonksiyonu" width="579" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Kayıt Listeleme (Read)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;read() fonksiyonumuzu kodluyoruz...&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1) &lt;code&gt;Model.select()&lt;/code&gt; ve &lt;code&gt;for&lt;/code&gt; döngüsü kullanarak kitaplarımızı listeleyebiliriz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kitaplar = Kitap.select()
for kitap in kitaplar:
    print(kitap.id, kitap.isim)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;"Kitabı oyuyan her bir kişiyi"&lt;/em&gt; listelemek için &lt;strong&gt;alt&lt;/strong&gt; &lt;code&gt;for&lt;/code&gt; döngüsü tanımlayalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    for okuyucu in kitap.okuyucular:
        print(okuyucu.isim)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Ek bilgi&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Model.select().count()&lt;/code&gt; veya &lt;code&gt;len(Model.select())&lt;/code&gt; kullanarak, sorgu sonucunun &lt;strong&gt;kaç adet kayıt&lt;/strong&gt; barındırdığını öğrenebiliriz.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Model.select().sql()&lt;/code&gt; kullanarak da sorgunun &lt;strong&gt;SQL karşılığına&lt;/strong&gt; ulaşabiliriz.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;2) Okuyucuları ve okudukları &lt;strong&gt;kitap sayısını&lt;/strong&gt; listeleyelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for okuyucu in Okuyucu.select():
    print(okuyucu.isim, okuyucu.kitaplar.count())
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff2m768iwacr1kh5p7z4t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff2m768iwacr1kh5p7z4t.png" alt="crud.py modülünün, read() fonksiyonu" width="553" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Buraya kadar yaptığımız değişiklikleri görmek için;&lt;br&gt;
&lt;code&gt;crud.py&lt;/code&gt; dosyamızın en altına, &lt;em&gt;fonksiyon çağrımızı&lt;/em&gt; ekleyelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;create()
read()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Şimdi &lt;strong&gt;komut satırımıza&lt;/strong&gt; dönelim ve sonucu görelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python3 crud.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvu4yev8m0m81xcwyp4g6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvu4yev8m0m81xcwyp4g6.png" alt="GNU/Linux üzerinde komut satırı" width="590" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Kayıt Güncelleme (Update)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;update() fonksiyonumuzu kodluyoruz...&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1) İlk olarak, kitabımıza ulaşmak için gerekli tanımlamayı yapalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;martin_eden = Kitap.get(Kitap.isim == "Martin Eden")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2) Değişikliğimizi tanımlayalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;martin_eden.isim = "Martin Ede"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3) Kaydı gerçekleştirmek ve değişikliği ekrana yazdırabilmek için ekleyelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;martin_eden.save()
print(martin_eden.isim)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4) Şimdi de &lt;strong&gt;farklı bir yöntem&lt;/strong&gt; kullanarak güncelleme tanımlaması yapalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Kitap.update(isim="Martin Eden").where(Kitap.id == martin_ed
den.id).execute()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;execute()&lt;/code&gt; metodu, işlemi gerçekleştirir ve güncellenen &lt;strong&gt;satır sayısını&lt;/strong&gt; &lt;code&gt;int&lt;/code&gt; tipinde döndürür.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;5) Hemen ardından değişikliği görebilmek için ekleyelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;martin_eden = Kitap.get(Kitap.id == martin_eden.id)
print(martin_eden.isim)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx412paezbka20sf7bqm1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx412paezbka20sf7bqm1.png" alt="Image description" width="732" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5) Son olarak &lt;code&gt;crud.py&lt;/code&gt; dosyamızın en sonuna &lt;em&gt;fonksiyon çağrımızı&lt;/em&gt; da ekleyelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#create()
#read()
update()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yukarıda;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;create()&lt;/code&gt; ve &lt;code&gt;read()&lt;/code&gt; çağrılarımızı &lt;em&gt;"yorum satırına"&lt;/em&gt; döndürdük ki çalışmasınlar.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Şimdi &lt;strong&gt;komut satırımıza&lt;/strong&gt; dönelim ve sonucu görelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python3 crud.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftq8xke19rwa154pi5wy4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftq8xke19rwa154pi5wy4.png" alt="Image description" width="603" height="85"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Çoklu Kayıt
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;multi_create() fonksiyonumuzu kodluyoruz...&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1) Öncelikle şu şekilde &lt;code&gt;tuple&lt;/code&gt; barındıran bir liste tanımlıyoruz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;veriler = [("Musullu Süleyman",),
           ("İsimsiz",),
           ("İnsanları Okumak",),
           ("Bilim Ne değildir?",)]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yukarıda;&lt;br&gt;
&lt;code&gt;tuple&lt;/code&gt; satır kolonlarını temsil ediyor, örneğimizde tek kolon olduğu için, &lt;code&gt;("Veri1",)&lt;/code&gt; şeklinde yazdık.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;2) Kitapları kaydetmek için ekleyelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Kitap.insert_many(veriler, fields=[Kitap.isim]).execute()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3) Okuyucuları &lt;strong&gt;farklı bir yöntemle&lt;/strong&gt; kaydetmek için, şu şekilde tanımlama yapalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;veriler = [{"isim": "İsimsiz"},
           {"isim": "Sefa"}]
Okuyucu.insert_many(veriler).execute()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Bu seferki örneğimizde &lt;code&gt;veriler&lt;/code&gt; isimli listemiz, &lt;code&gt;dict&lt;/code&gt; tipinde kolonlar barındırıyor. Ayrıca &lt;code&gt;insert_many()&lt;/code&gt; metodu, &lt;code&gt;fields=[]&lt;/code&gt; parametresi almıyor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Kaydettiğimiz kitaplara, kaydettiğimiz okuyucuları tanımla işlemiyle devam ediyoruz...&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;4) Okuyuculara ulaşalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;isimsiz = Okuyucu.get(Okuyucu.isim.contains("siz"))
abdullah = Okuyucu.get(Okuyucu.isim.startswith("A"))
sefa = Okuyucu.get(Okuyucu.isim.endswith("fa"))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yukarıda;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"siz" ifadesi geçen kayıt getirilecek.&lt;/li&gt;
&lt;li&gt;"A" ile &lt;strong&gt;başlayan&lt;/strong&gt; kayıt getirilecek.&lt;/li&gt;
&lt;li&gt;"fa" ile &lt;strong&gt;biten&lt;/strong&gt; kayıt getirilecek.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ek bilgi&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bu metotlar, &lt;code&gt;where()&lt;/code&gt; içeriside de kullanılabilir.&lt;/li&gt;
&lt;li&gt;Ek olarak; &lt;code&gt;between()&lt;/code&gt;, &lt;code&gt;in_()&lt;/code&gt;, &lt;code&gt;not_in()&lt;/code&gt;, ... gibi birçok metot mevcut.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;5) Aranacak &lt;strong&gt;kitap&lt;/strong&gt; ve tanımlanacak &lt;strong&gt;okuyucu&lt;/strong&gt; listeleri oluşturalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aranacaklar = ["isi", "mus", "oku", "bil"]
okuyucular = [isimsiz, [abdullah, sefa], abdullah, [abdullah, sefa]]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yukarıda;&lt;br&gt;
2 liste de &lt;strong&gt;aynı sayıda&lt;/strong&gt; eleman içermekte, birden fazla okuyucu &lt;strong&gt;alt liste&lt;/strong&gt; içerisinde tanımlanmakta.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;6) &lt;code&gt;for&lt;/code&gt; döngüsü yardımıyla tanımlamaları gerçekleştirelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;index = 0
for aranan in aranacaklar:
    kitap = Kitap.get(Kitap.isim.contains(aranan))
    okuyucu = okuyucular[index]

    if type(okuyucu) == list:
        for _okuyucu in okuyucu:
            kitap.okuyucular.add(_okuyucu)
    else:
        kitap.okuyucular.add(okuyucu)

    index += 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yukarıda;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;index&lt;/code&gt; değişkeni, listelerin &lt;strong&gt;index değerini&lt;/strong&gt; barındırıyor.&lt;/li&gt;
&lt;li&gt;Döngü boyunca kitap aranıyor ve bulunan kitap, &lt;code&gt;kitap&lt;/code&gt; değişkenine aktarılıyor. Kitabı okuyan okuyucu ise, &lt;code&gt;okuyucular&lt;/code&gt; listesinden &lt;code&gt;index&lt;/code&gt; yardımıyla &lt;code&gt;okuyucu&lt;/code&gt; değişkenine aktarılıyor.&lt;/li&gt;
&lt;li&gt;Eğer kitabı okuyan &lt;code&gt;okuyucu&lt;/code&gt; &lt;strong&gt;birden fazla&lt;/strong&gt; ise (yani liste tipindeyse); &lt;strong&gt;alt&lt;/strong&gt; &lt;code&gt;for&lt;/code&gt; döngüsü çalışıyor, &lt;strong&gt;her bir okuyucu, kitaba tanımlanıyor.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Eğer kitabı okuyan okuyucu &lt;strong&gt;tek&lt;/strong&gt; ise; kitaba okuyucu tanımlanıyor.&lt;/li&gt;
&lt;li&gt;Döngü boyunca &lt;code&gt;index&lt;/code&gt; değeri 1 arttırılıyor.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsakxj35xevnkk9ux8wjb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsakxj35xevnkk9ux8wjb.png" alt="Image description" width="660" height="616"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Kayıt Silme (Delete)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Delete() fonksiyonumuzu kodluyoruz...&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1) Silinecek kayıtarımızı tanımlayalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kitap = Kitap.get(Kitap.isim == "İsimsiz")
okuyucu = Okuyucu.get(Okuyucu.isim == "İsimsiz")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2) &lt;strong&gt;Okuyucuya&lt;/strong&gt; tanımlanan &lt;strong&gt;kitabı&lt;/strong&gt; silebilmek için ekleyelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;okuyucu.kitaplar.remove(kitap)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ya da tam tersi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kitap.okuyucular.remove(okuyucu)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Ek bigi&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;clear()&lt;/code&gt; metodu ilişkili bütün kayıtları siler.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;3) Şimdi kitabı silebilmek için tanımlalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kitap.delete_instance()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4) Son olarak, okuyucuyu &lt;strong&gt;farklı şekilde&lt;/strong&gt; silebilmek için ekleyelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Okuyucu.delete().where(Okuyucu.id == okuyucu.id).execute()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;execute()&lt;/code&gt; metodu, işlemi gerçekleştirir ve silinen &lt;strong&gt;satır sayısını&lt;/strong&gt; &lt;code&gt;int&lt;/code&gt; tipinde döndürür.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frlrs99356mjz6maspfx2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frlrs99356mjz6maspfx2.png" alt="Image description" width="573" height="249"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  JOIN İŞLEMLERİ &lt;a&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;JOIN?&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Birden fazla modelden &lt;strong&gt;tek seferde&lt;/strong&gt; veri çekilmesi gerektiğinde devreye join işlemi girer. Modellerimize tanımladığımız &lt;code&gt;peewee.ForeignKeyField&lt;/code&gt;, &lt;code&gt;peewee.ManyToManyField&lt;/code&gt; gibi &lt;strong&gt;ilişki kolonları&lt;/strong&gt; sayesinde modelleri birleştirebiliyoruz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hazırlık
&lt;/h2&gt;

&lt;p&gt;1) &lt;code&gt;join.py&lt;/code&gt; isminde yeni bir dosya oluşturalım ve içerisine şu şekilde bir yapı tanımlayalım:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feb0ypk4mqwsvgropnwmd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feb0ypk4mqwsvgropnwmd.png" alt="Image description" width="689" height="613"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Yukarıda;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tarih işlemleri için &lt;code&gt;datetime&lt;/code&gt; modülünü içe aktardık.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;models.py&lt;/code&gt; dosyamızda yer alan ve ihtiyacımız olacak modelleri içe aktardık.&lt;/li&gt;
&lt;li&gt;İlk defa &lt;code&gt;peewee.IntegerField&lt;/code&gt;, &lt;code&gt;peewee.DateField&lt;/code&gt;, &lt;code&gt;peewee.FloatField&lt;/code&gt; kullanan modeller tanımladık.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;peewee.ForeignKeyField&lt;/code&gt; kullanarak modeller arası &lt;strong&gt;bire-bir&lt;/strong&gt;(Kitap-KitapDetay) ve &lt;strong&gt;bire-çok&lt;/strong&gt;(Yazar-Kitap) ilişkiler tanımladık.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;Bire-bir İlişki?&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Bire-bir ilişki bize şunu söyler; &lt;strong&gt;bir&lt;/strong&gt; kitabı, &lt;strong&gt;bir&lt;/strong&gt; yazar yazabilir veya bir kitabın, bir tane fiyatı olabilir.&lt;/p&gt;

&lt;p&gt;Yani &lt;code&gt;KitapDetay&lt;/code&gt; modelinde yer alan &lt;code&gt;kitap&lt;/code&gt; kolonu, &lt;strong&gt;bir kez&lt;/strong&gt; kullanılabilir, aynı kitap tekrar edemez.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class KitapDetay(Modelimiz):
    kitap = pw.ForeignKeyField(Kitap, backref="kitaplar", primary_key=True)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yukarıda;&lt;br&gt;
&lt;code&gt;primary_key=True&lt;/code&gt; parametresi sayesinde; benzersiz &lt;code&gt;id&lt;/code&gt; kolonu oluşturulmaz yerine &lt;code&gt;kitap_id&lt;/code&gt; ayarlanır. kitap_id, &lt;code&gt;Kitap&lt;/code&gt; modelinin &lt;code&gt;id&lt;/code&gt; kolonununa karşılık gelir. (KitapDetay.kitap_id == Kitap.id)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Bire-çok İlişki?&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Bire-çok ilişki bize şunu söyler; yazar, &lt;strong&gt;birden çok&lt;/strong&gt; kitap yazmış olabilir.&lt;/p&gt;

&lt;p&gt;Yani &lt;code&gt;KitapDetay&lt;/code&gt; modelinde yer alan &lt;code&gt;yazar&lt;/code&gt; kolonu, &lt;strong&gt;birden fazla&lt;/strong&gt; kez tekrar edebilir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class KitapDetay(Modelimiz):
    kitap = pw.ForeignKeyField(Kitap, backref="kitaplar", primary_key=True)
    yazar = pw.ForeignKeyField(Yazar, backref="yazarlar")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Somut bir örnek olarak;&lt;br&gt;
&lt;em&gt;"Martin Eden"&lt;/em&gt; kitabı &lt;strong&gt;bir kere&lt;/strong&gt; yer alabilirken, &lt;em&gt;"Jack London"&lt;/em&gt; yazarı &lt;strong&gt;birden fazla&lt;/strong&gt; kez yer alabilir. (Jack London'ın başka bir kitabını eklemek isteyebiliriz ;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;2) Daha önceki bilgilerimizi kullanarak &lt;code&gt;create()&lt;/code&gt; fonksiyonumuzu kodlayalım:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpeczv7vwievtlogaxuap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpeczv7vwievtlogaxuap.png" alt="Image description" width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Yukarıda;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yeni yazarlar kaydedilecek.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kitaplar&lt;/code&gt; listesi üzerinde &lt;code&gt;for&lt;/code&gt; döngüsü çalışacak. Döngü boyunca; &lt;em&gt;"kitap"&lt;/em&gt; ve &lt;em&gt;"okuyucu"&lt;/em&gt; bilgileri &lt;code&gt;Model.get()&lt;/code&gt; ve -aynı görevi gören- &lt;code&gt;Model.select().where().get()&lt;/code&gt; ile alınacak.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;index&lt;/code&gt; değişkeni sayesinde karşılık gelen &lt;em&gt;"tarih"&lt;/em&gt; ve &lt;em&gt;"fiyat"&lt;/em&gt; bilgileri de alınacak, ardından bütün bu bilgiler &lt;code&gt;dict&lt;/code&gt; tipinde &lt;code&gt;veriler&lt;/code&gt; listesine eklenecek.&lt;/li&gt;
&lt;li&gt;Son olarak döngü sonucunda oluşan &lt;code&gt;veriler&lt;/code&gt; listesi, &lt;code&gt;KitapDetay&lt;/code&gt; modelimize kaydedilecek.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Kitap Detaylarını Listeleme
&lt;/h2&gt;

&lt;p&gt;Bunun için &lt;code&gt;KitapDetay&lt;/code&gt;, &lt;code&gt;Kitap&lt;/code&gt; ve &lt;code&gt;Yazar&lt;/code&gt; modellerini birleştirmemiz gerekecek.&lt;/p&gt;

&lt;p&gt;1) İlk tanımlamamızı gerçekleştirelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kitaplar = (KitapDetay
            .select(Kitap.isim,
                    Yazar.isim.alias("yazar"),
                    KitapDetay.tarih,
                    KitapDetay.fiyat))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yukarıda;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sorgumuzu &lt;code&gt;()&lt;/code&gt; içerine alarak, &lt;strong&gt;çok satırlı&lt;/strong&gt; bir şekilde yazım gerçekleştirebildik.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;alias()&lt;/code&gt; metodu, kolonlara &lt;strong&gt;arzuladığımız bir isim&lt;/strong&gt; verebilmeyi sağlıyor. (Örneğimizde hem kitap ismi, hem de yazar ismi aynı anda yer aldığı için, karışmasını engelledik.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;2) &lt;code&gt;join()&lt;/code&gt; metodunu kullanarak &lt;code&gt;Kitap&lt;/code&gt; modelimizi, &lt;code&gt;switch() ve join()&lt;/code&gt; metotlarıyla da &lt;code&gt;Yazar&lt;/code&gt; modelimizi birleştirmek için parantezin içerisine ekleyelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
.join(Kitap)
.switch(KitapDetay)
.join(Yazar))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yukarıda;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;switch()&lt;/code&gt; metodu sayesinde &lt;code&gt;Yazar&lt;/code&gt; modeli, &lt;code&gt;Kitap&lt;/code&gt; modeliyle değil &lt;code&gt;KitapDetay&lt;/code&gt; modeliyle birleşecek. Tersi durumda bu iki tablo arasında &lt;strong&gt;bir ilişki olmadığı&lt;/strong&gt; için hata alacaktık.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ek bilgi&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yalnızca &lt;code&gt;where()&lt;/code&gt; kullanarak veya şu şekilde zincirleme ifadeler kullanarak filtrelemeler yapmak mümkün:&lt;/li&gt;
&lt;/ul&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
.join(Yazar)
.where(Yazar.isim == "Martin Eden")
.where(KitapDetay.fiyat &amp;lt; 60)
.orwhere(KitapDetay.tarih.year &amp;gt;= 1995))
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Hatırlatma;&lt;/strong&gt; bu ifadelerin &lt;code&gt;SQL&lt;/code&gt; karşılığını görmek için; &lt;code&gt;kitaplar.sql()&lt;/code&gt; kullanabiliriz.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;3) Listeyi &lt;strong&gt;tarihe göre&lt;/strong&gt; sıralamak için parantezin içine ekleyelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
.order_by(KitapDetay.tarih.desc()))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yukarıda;&lt;br&gt;
&lt;code&gt;desc()&lt;/code&gt; &lt;strong&gt;son tarih başta&lt;/strong&gt; olsun demek oluyor. Eğer sadece kolon ismi belirtirsek, &lt;code&gt;asc()&lt;/code&gt; kullanılmış gibi varsayılır ve bu durumda, &lt;strong&gt;ilk tarih başta&lt;/strong&gt; olsun demiş oluruz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ek bilgi&lt;/strong&gt;&lt;br&gt;
Sorgumuzun sonuna; &lt;code&gt;limit(3)&lt;/code&gt;(Kaç adet kayıt listeleneceği), &lt;code&gt;distinct()&lt;/code&gt;(Yalnızca tekrar etmeyen kayıtların listeleneceği) gibi metotlar ekleyebiliriz.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;4) Son olarak listeleme işlemini gerçekleştirmek için tanımlayalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for kitap in kitaplar.dicts():
        print(kitap)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yukarıda;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dicts()&lt;/code&gt;, satırları &lt;em&gt;"sözlük veri tipinde(dict)"&lt;/em&gt; almamızı sağlar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ek bilgi&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;tuples()&lt;/code&gt; veya &lt;code&gt;namedtuples()&lt;/code&gt; kullanmak da mümkün.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwql10nd69fsgm8iypo0t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwql10nd69fsgm8iypo0t.png" alt="Image description" width="698" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Okuyucuları Listeleme
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;read() fonksiyonumuzu kaldığımız yerden kodlamaya devam ediyoruz...&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;1) Öncelikle bu kez &lt;code&gt;select()&lt;/code&gt;'de kullanacağımız kolonları ayrı tanımlayalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;miktar = pw.fn.COUNT(OkunanKitap.kitap_id).alias("okunan_miktar")
birlesik = Okuyucu.isim.concat("+").concat(Kitap.isim).alias("birlesik")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yukarıda;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;miktar&lt;/code&gt; değişkenine atadığımız kolon; &lt;code&gt;peewee.fn.COUNT()&lt;/code&gt; 'u kullanarak &lt;code&gt;OkunanKitap.kitap_id&lt;/code&gt;'nin kaç adet olduğunu öğrenmemizi sağlayacak.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;birlesik&lt;/code&gt; değişkenine atadığımız kolon; &lt;code&gt;concat()&lt;/code&gt; metodunu kullanarak &lt;code&gt;Okuyucu.isim&lt;/code&gt; ve &lt;code&gt;Kitap.isim&lt;/code&gt; kolonlarını aralarına "+" işareti koyarak birleştirmemizi (tek kolon haline getirmemizi) sağlayacak.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ek bilgi&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;alias()&lt;/code&gt; metodunu modeller için de kullanabiliriz:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;model = Model.alias("model_name")&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;2) Bu adımda &lt;code&gt;okuyucular&lt;/code&gt; değişkenimizin sorgusunu tanımlamaya başlayalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;okuyucular = (Okuyucu
              .select(Okuyucu.isim, miktar, birlesik)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3) &lt;code&gt;OkunanKitap&lt;/code&gt; ve &lt;code&gt;Kitap&lt;/code&gt; modellerimizi birleştirelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
.join(OkunanKitap, pw.JOIN.LEFT_OUTER,
      on=(Okuyucu.id == OkunanKitap.okuyucu_id))
.join(Kitap, pw.JOIN.LEFT_OUTER,
      on=(Kitap.id == OkunanKitap.kitap_id))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yukarıda;&lt;br&gt;
&lt;code&gt;join()&lt;/code&gt; metodunu, &lt;strong&gt;birleşim türü&lt;/strong&gt; (LELFT_OUTER, RIGHT_OUTER, vb.) ve &lt;strong&gt;birleşim tercihi&lt;/strong&gt; (on=()) ile beraber kullandık.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;4) Her bir okuyucunun okuduğu kitap sayısını listelettireceğimiz için, &lt;em&gt;okuyucu grubu&lt;/em&gt; tanımlayalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
.group_by(Okuyucu.id)
.order_by(miktar, Okuyucu.isim))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yukarıda;&lt;br&gt;
&lt;code&gt;order_by()&lt;/code&gt; metoduna, &lt;strong&gt;birden fazla&lt;/strong&gt; sıralanacak kolon tanımlanıyor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;5) Son olarak okuyucular listemizi görüntüleyelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for okuyucu in okuyucular.objects():
   print(okuyucu.isim,
         okuyucu.okunan_miktar,
         okuyucu.birlesik)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yukarıda;&lt;br&gt;
&lt;code&gt;objects()&lt;/code&gt; her bir satırı &lt;strong&gt;nesne olarak&lt;/strong&gt; kullanmamızı sağlıyor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiviftnfqlhbth81x6kkp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiviftnfqlhbth81x6kkp.png" alt="Image description" width="695" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6) Şimdi &lt;strong&gt;komut satırına&lt;/strong&gt; dönelim ve sonucu görelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python join.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqba5304crro46ltwjtep.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqba5304crro46ltwjtep.png" alt="GNU/Linux üzerinde komut satırı" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Böylece bu yazının sonuna geldik. Bir başka yazıda görüşmek üzere...&lt;/p&gt;

</description>
      <category>orm</category>
      <category>database</category>
      <category>python</category>
      <category>programming</category>
    </item>
    <item>
      <title>Kodlama Öncesi: Bazı Bilgisayar Kavramları</title>
      <dc:creator>Abdullah Emiroğlu</dc:creator>
      <pubDate>Sun, 02 Jan 2022 19:32:42 +0000</pubDate>
      <link>https://dev.to/abdullahemrgl/kodlama-oncesi-bazi-bilgisayar-kavramlari-21kc</link>
      <guid>https://dev.to/abdullahemrgl/kodlama-oncesi-bazi-bilgisayar-kavramlari-21kc</guid>
      <description>&lt;p&gt;&lt;strong&gt;Medium'dan okumak için:&lt;/strong&gt; &lt;a href="https://abdullahemiroglu.medium.com/kodlama-%C3%B6ncesi-baz%C4%B1-bilgisayar-kavramlar%C4%B1-78e413f222c9" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu yazıda, &lt;strong&gt;başlangıç seviyesinde&lt;/strong&gt; bazı bilgisayar kavramlarını açıklamaya çalıştım. Bu yazıda ele alacağım kavramlar, bilgisayar ile iç içe olduğunuz müddetçe karşınıza çıkacak kavramlar. Umarım kavramlara aşinalık kazanmanızda, ufak da olsa bir katkısı olur.&lt;/p&gt;

&lt;p&gt;İçerik:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uygulama (App)&lt;/li&gt;
&lt;li&gt;
Dosya (File)

&lt;ul&gt;
&lt;li&gt;Dosya Uzantısı (File Extention)&lt;/li&gt;
&lt;li&gt;Dizin veya Klasör (Directory)&lt;/li&gt;
&lt;li&gt;Dosya Yöneticisi (File Manager)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Düz Metin Dosyası (Plain Text File)

&lt;ul&gt;
&lt;li&gt;Karakter Kodlaması (Character Encoding)&lt;/li&gt;
&lt;li&gt;Metin Düzenleyici (Text Editor)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Komut Satırı (Command Line)&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  Uygulama (App)
&lt;/h1&gt;

&lt;p&gt;Uygulama; bilgisayarda/telefonda &lt;strong&gt;belirli bir amacı gerçekleştirebilmek&lt;/strong&gt; için, o belirli amaca yönelik geliştirilen &lt;strong&gt;yazılımlardır.&lt;/strong&gt; Örneğin; video izlemek için kullandığınız, internette gezinmek için kullandığınız veya resimlerinizi görüntülemek için kullandığınız yazılımların hepsi birer "bilgisayar/telefon uygulaması" olarak tanımlanır. Genelde aynı görevi yerine getiren birçok uygulama vardır. Yaptıkları iş &lt;strong&gt;temelde aynı olmasına&lt;/strong&gt; karşın, özellikleri veya görünümleri farklı olabilmektedir. Böylece farklı ihtiyaçlar ve kullanıcılar için, farklı seçenekler sunulmuş oluyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq0m12f2gb901u3uhtq4i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq0m12f2gb901u3uhtq4i.png" alt="Alt Text" width="600" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Uygulamaları Nasıl Başlatırız?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Genellikle bilgisayarda yer alan &lt;strong&gt;uygulama menüsü&lt;/strong&gt; veya &lt;strong&gt;uygulama arama&lt;/strong&gt; gibi bir özelliğe ulaşmamız gerekir. Aşağıda XFCE arayüzüne sahip bir bilgisayardan örnek görüyorsunuz:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzq6co8vb6suof4lbd95t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzq6co8vb6suof4lbd95t.png" alt="XFCE uygulama menüsü" width="421" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsomvjfk56yj9xkqnkuhc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsomvjfk56yj9xkqnkuhc.png" alt="XFCE uygulama arama penceresi" width="446" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Uygulamalarla ilgili 3 temel işlem var:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kurulum:&lt;/strong&gt; Yeni bir uygulamayı bilgisayarda  kullanılabilir hale getirme.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kaldırma:&lt;/strong&gt; Bir uygulamayı bilgisayardan yok etme.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Güncelleme:&lt;/strong&gt; Bir uygulamanın yeni sürümlerini kullanılabilir hale getirme. (Hata giderilmesi, yeni özellikler eklenmesi vb.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ve en önemlisi yukarıdaki listede yer alan, "belirli amaçları" gerçekleştirmeyi sağlayan, yine başka bir uygulama var. Uygulama için, uygulama var :)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Genellikle &lt;strong&gt;Uygulama/Yazılım/Paket Mağazası/Yöneticisi/Merkezi...&lt;/strong&gt; gibi isimlere sahiptirler.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Dosya (File)
&lt;/h1&gt;

&lt;p&gt;Dosya; bir &lt;strong&gt;depolama cihazı&lt;/strong&gt; içerisinde tutulan &lt;strong&gt;veridir&lt;/strong&gt;. Bu veri; resim, video, ses, yazı gibi daha &lt;strong&gt;yüzlerce farklı biçimde/çeşitte&lt;/strong&gt; olabilmektedir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dosya&lt;/strong&gt; olarak adlandırdığımız kavram sayesinde, bu çok sayıdaki veri çeşitliliğini bilgisayarda kullanmak üzere tanımlamış oluyoruz. Yani adeta verimizi &lt;strong&gt;dosya şeklinde paketlemiş&lt;/strong&gt; oluyoruz. Böylelikle telefon, bilgisayar, televizyon gibi farklı cihazlar üzerinde kullanabiliyor, taşıyabiliyor, paylaşabiliyor ve görüntüleyebiliyoruz. Herhangi bir dosyanın biçimini/çeşidini belirtmek için ise; &lt;strong&gt;dosya uzantısı (file extention)&lt;/strong&gt; dediğimiz bir kavramdan yararlanıyoruz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dosya Uzantısı (File Extention)
&lt;/h2&gt;

&lt;p&gt;Örneğin resim verisine sahip dosyamızı düşünelim; fotoğraf makinemiz, çektiğimiz fotoğrafları hafıza kartına bir &lt;strong&gt;dosya&lt;/strong&gt; şeklinde kaydediyor. Peki bu dosyanın, "resim dosyası" olduğunu nereden biliyoruz? Telefon/bilgisayar bu dosyayı, ses dosyasından nasıl ayırt edebiliyor? İşte bu noktada devreye "dosya uzantısı (file extention)" giriyor. Dosya adının sonuna nokta işareti koyuyoruz, işte bu koyduğumuz noktadan sonra yazdıklarımız bir dosyanın biçimini (formatını) belirleyebilmemizi sağlıyor. Tabii bu dosya uzantısını kafamıza göre değil, &lt;strong&gt;önceden belirlenmiş&lt;/strong&gt; şekliyle yazmamız gerekiyor. Resim örneğinden devam edersek; fotoğraf makinemiz dosyaya otomatik bir &lt;strong&gt;isim&lt;/strong&gt; ve &lt;strong&gt;uzantı&lt;/strong&gt; ekliyor. Böylece biz resmimizin hangi formatta (biçimde) olduğunu bilebiliyoruz, aynı şekilde bilgisayar, kurulu olan hangi uygulamanın bu dosyayı açacabileceğini bilebiliyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fam8r1ialrg2rdelpgnuk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fam8r1ialrg2rdelpgnuk.png" alt="uzantı görselleştirmesi" width="600" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxb7hgzorq4156b2qrkwp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxb7hgzorq4156b2qrkwp.png" alt="çeşitli uzantılara sahip dosya örnekleri" width="500" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dizin veya Klasör (Directory)
&lt;/h2&gt;

&lt;p&gt;Dizin (Klasör); birden çok dosyayı &lt;strong&gt;bir arada gruplamamızı&lt;/strong&gt; sağlayan bir kavramdır. Çok sayıda olan dosyalarımızı, dizin kavramı sayesinde farklı isimler altında gruplayabiliyoruz. Örneğin çok sayıda resim, video ve ses dosyamız olduğunu düşünelim, bu karmaşıklığı önlemek için; istediğimiz isimlerde dizinler oluşturup, bu dizinlerin içerisine istediğimiz dosyaları taşıyabiliriz. Böylece telefonda/bilgisayarda düzenli bir şekilde dosyalarımızı depolamış oluruz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dosya Yöneticisi (File Manager)
&lt;/h2&gt;

&lt;p&gt;Dosyalar ve dizinler üzerinde çeşitli işlemler yapabilmemizi (yani yönetmemizi) sağlayan uygulamalardır.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Bu temel işlemler:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dizin oluşturma&lt;/li&gt;
&lt;li&gt;Dizin ve dosya silme,&lt;/li&gt;
&lt;li&gt;kopyalama,&lt;/li&gt;
&lt;li&gt;taşıma,&lt;/li&gt;
&lt;li&gt;isimlendirme&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aşağıda thunar isimli "dosya yöneticisi uygulamasını" görüyoruz:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiso7u6vpdd2t17lhhtgg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiso7u6vpdd2t17lhhtgg.png" alt="Fedora üzerinde thunar" width="800" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Düz Metin Dosyası (Plain Text File)
&lt;/h1&gt;

&lt;p&gt;İçeriğinde metinsel ifadeler ve karakterler barındıran &lt;strong&gt;dosyalardır.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Karakter Kodlaması (Character Encoding)
&lt;/h2&gt;

&lt;p&gt;Karakter; klavyenizde yer alan (boşluk dahil) harf, şekil ve sembolllerin herhangi bir tanesidir. Mesela okuduğunuz bu yazıda, çok sayıda &lt;strong&gt;karakter&lt;/strong&gt; bulunmaktadır. Peki bütün bu yazılar Arapça veya Japonca olsaydı? Mesela Türkçe'deki bazı karakterler İngilizce'de yer almaz (ğ, ö vb.) buna karşın birçok ortak karakter de vardır (g, o vb.). İşte &lt;strong&gt;karakter kodlaması&lt;/strong&gt; dediğimiz kavram sayesinde bütün farklı dillere ait karakterleri de bilgisayar üzerinde doğru bir şekilde görüntüleyip, kullanabiliyoruz. En yaygın kullanılan karakter kodlaması &lt;strong&gt;UTF-8&lt;/strong&gt;'dir.&lt;br&gt;
Aşağıda düz yazı dosyasını kaydederken, "karakter kodlaması seçiminin" yapılabildiğini görüyoruz:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu7y7qnug5g3bco8nl4qz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu7y7qnug5g3bco8nl4qz.png" alt="Düz yazı dosyası kaydetme penceresinde " width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Metin Düzenleyici (Text Editor)
&lt;/h2&gt;

&lt;p&gt;Metin dosyalarının üzerinde çeşitli işlemler yapmamızı sağlayan uygulamalardır.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Bu temel işlemler:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Metin ve karakter ekleme,&lt;/li&gt;
&lt;li&gt;düzeltme,&lt;/li&gt;
&lt;li&gt;silme&lt;/li&gt;
&lt;li&gt;ve arama yapma&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aşağıda "düz metin dosyası düzenleme uygulamasına" 2 örnek görüyoruz (VS Code ve mousepad):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3z2b785peayhppqdxugp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3z2b785peayhppqdxugp.png" alt="(Fedora üzerinde VS Code ve mousepad" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Komut Satırı (Command Line)
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;komut satırı&lt;/strong&gt; (veya uçbirim/terminal) uygulamasını kullanarak; istediğimiz bir &lt;strong&gt;görevi&lt;/strong&gt; yazabiliyoruz. Bu "görev yazma eylemi" ile, bilgisayarın ilgili görevi yerine getirmesini sağlamış oluyoruz.&lt;br&gt;
Görsel arayüz daha henüz yokken bilgisayarlar bu şekilde kullanılıyordu. Yaptığımız bu &lt;em&gt;görev yazma&lt;/em&gt; işlemine; &lt;strong&gt;komut&lt;/strong&gt; diyoruz. (Görev = Komut)&lt;/p&gt;

&lt;p&gt;Günümüz bilgisayarlarını görsel arayüz (GUI) ile kullanıyoruz. Sadece bir düğmeye tıklayarak, aslında bilgisayara yapmasını istediğimiz bir komut vermiş oluyoruz.&lt;/p&gt;

&lt;p&gt;Aşağıda "komut satırı uygulaması" örneği görüyoruz:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjy072s8azaoop7tmurgf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjy072s8azaoop7tmurgf.png" alt="Komut satırı örneği" width="732" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ne gibi Komutlar Verebiliyoruz?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Mesela önceki bölümlerde gördüğümüz dosya yöneticisinin yaptığı bütün işlemleri komut yazarak yapabiliyoruz. Kurulu bir uygulamayı ismini yazarak başlatabiliyoruz. Bilgisayarı kapatabiliyoruz. Video kesip, birleştirme yapabiliyoruz. Hatta kendi komut satırı uygulamalarımızı yazabiliyoruz ve daha binlercesi...&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>beginners</category>
      <category>codepen</category>
      <category>basics</category>
    </item>
    <item>
      <title>Glade ve Kullanımı</title>
      <dc:creator>Abdullah Emiroğlu</dc:creator>
      <pubDate>Mon, 07 Sep 2020 15:38:23 +0000</pubDate>
      <link>https://dev.to/abdullahemrgl/glade-ve-kullanimi-3bke</link>
      <guid>https://dev.to/abdullahemrgl/glade-ve-kullanimi-3bke</guid>
      <description>&lt;h1&gt;
  
  
  Glade Nedir?
&lt;/h1&gt;

&lt;p&gt;Kısaca programlama beceriniz/bilginiz olmasa bile &lt;a href="https://tr.wikipedia.org/wiki/Grafiksel_kullan%C4%B1c%C4%B1_aray%C3%BCz%C3%BC" rel="noopener noreferrer"&gt;&lt;strong&gt;Grafiksel Kullanıcı Arayüzleri&lt;/strong&gt; (GUI)&lt;/a&gt; oluşturabileceğiniz &lt;a href="https://tr.wikipedia.org/wiki/%C3%96zg%C3%BCr_yaz%C4%B1l%C4%B1m" rel="noopener noreferrer"&gt;özgür ve açık kaynaklı&lt;/a&gt; bir uygulamadır.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://glade.gnome.org/" rel="noopener noreferrer"&gt;Glade&lt;/a&gt;, &lt;a href="https://tr.wikipedia.org/wiki/GNU" rel="noopener noreferrer"&gt;GNU&lt;/a&gt;/&lt;a href="https://tr.wikipedia.org/wiki/Linux" rel="noopener noreferrer"&gt;Linux&lt;/a&gt;'un popüler GUI &lt;a href="https://tr.wikipedia.org/wiki/K%C3%BCt%C3%BCphane_(bilgisayar_bilimi)" rel="noopener noreferrer"&gt;kütüphanesi&lt;/a&gt; olan &lt;a href="https://tr.wikipedia.org/wiki/GTK%2B" rel="noopener noreferrer"&gt;GTK&lt;/a&gt; uygulamalarını hızlı ve görsel bir şekilde hazırlamayı mümkün kılıyor.&lt;/p&gt;

&lt;p&gt;Hazırlanan arayüzler &lt;a href="https://tr.wikipedia.org/wiki/XML" rel="noopener noreferrer"&gt;XML&lt;/a&gt; dosyası olarak kaydediliyor. Bu XML dosyası; &lt;a href="https://www.gtk.org/docs/language-bindings/" rel="noopener noreferrer"&gt;C, C++, Javascript, Python, Rust&lt;/a&gt; gibi birçok &lt;a href="https://tr.wikipedia.org/wiki/Programlama_dili" rel="noopener noreferrer"&gt;programlama dili&lt;/a&gt; ile kullanılabiliyor. Glade, hem Windows hem de macOS'da çalışıyor bu platformlarda çalışacak GUI uygulamaları için arayüz tasarlanabiliyor.&lt;/p&gt;

&lt;h1&gt;
  
  
  Kullanım Amacı Ne Olabilir?
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://tr.wikipedia.org/wiki/Yerli_kip" rel="noopener noreferrer"&gt;Yerel&lt;/a&gt; GNU/Linux arayüz geliştirme aracı olduğu için, hazırlanan arayüzleri GNU/Linux'un çalıştığı her platformda kullanabilme esnekliği var(&lt;a href="https://tr.wikipedia.org/wiki/Raspberry_Pi" rel="noopener noreferrer"&gt;Raspberry Pi&lt;/a&gt;.) GNU/Linux'un düşük/eski donanım özellikli bilgisayarlarda da çalışabildiği düşünülürse, &lt;a href="https://tr.wikipedia.org/wiki/Canl%C4%B1_sistem" rel="noopener noreferrer"&gt;canlı&lt;/a&gt; bir GNU/Linux usb oluşturup, başka bilgisayarlara zahmetsizce geçip, işler aksamadan Glade ile hazırlanan uygulamayı kullanabiliriz. Bu, özellikle pratiklik ve lokallik gerektiren veri tabanı uygulamaları için düşünülmesi gereken bir opsiyon...&lt;/p&gt;

&lt;h1&gt;
  
  
  Nasıl Kurulur?
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;GNU/Linux:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Dağıtımınızın paket yöneticisini veya yazılım merkezini kullanarak &lt;strong&gt;glade&lt;/strong&gt; paketini kurabilirsiniz.&lt;br&gt;
&lt;a href="https://flatpak.org/setup/" rel="noopener noreferrer"&gt;Flatpak&lt;/a&gt; ile kurmak için terminal komutu: &lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt; flatpak install flathub org.gnome.Glade
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Windows:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;MSYS2 Paket Yöneticisi ile kurabilirsiniz.&lt;br&gt;
1- MSYS2'yi &lt;a href="https://www.msys2.org/#installation" rel="noopener noreferrer"&gt;bu linkteki&lt;/a&gt; adımları tamamlayarak sisteminize kurun.&lt;br&gt;
2- MSYS2'yi çalıştırıp şu komutu girin:&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pacman -S mingw-w64-x86_64-glade
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;3- Çalıştırmak için şu komutu girin:&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;glade
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;macOS:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Homebrew Paket Yöneticisi ile kurabilirsiniz. &lt;br&gt;
1- Homebrew'ü &lt;a href="https://brew.sh/" rel="noopener noreferrer"&gt;bu linkteki&lt;/a&gt; adımları uygulayarak sisteminize kurun.&lt;br&gt;
2- macOS komut satırına (terminale) şu komutu girin:&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install glade
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;3- Çalıştırmak için şu komutu girin:&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;glade
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Nasıl Kullanılır?
&lt;/h1&gt;

&lt;p&gt;Glade'i ingilizce kullanmak için şu komutu girerek başlatın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LANG=C glade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Not:&lt;/strong&gt; Eğer Flatpak ile kurduysanız &lt;code&gt;LANG=C flatpak run org.gnome.Glade&lt;/code&gt; komutu vermeniz gerekebilir.&lt;/p&gt;

&lt;p&gt;Glade, 5 ana bölüme sahip: &lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/ZUtY6QBxcng"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Glade ile GTK için arayüz geliştiriyoruz, haliyle GTK'nin Container(Kapsayıcı) mantığını kullanıyoruz. Her bir &lt;a href="https://tr.wikipedia.org/wiki/Widget" rel="noopener noreferrer"&gt;Widget(Bileşen)&lt;/a&gt; bir üst Container Widget(Kapsayıcı Bileşen) içerisinde yer alıyor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Container Widget(Kapsayıcı Bileşen)

&lt;ul&gt;
&lt;li&gt;Widget(Bileşen)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Şimdi bir form tasarlayarak bu mantığı iyice kavralayalım. Formumuza şu widgetları ekleyeceğiz:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcsgdlpg10i16w0f0xdue.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcsgdlpg10i16w0f0xdue.png" alt="Glade Widget Yapısı" width="348" height="279"&gt;&lt;/a&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/e3eCpAVQlEQ"&gt;
&lt;/iframe&gt;
&lt;br&gt;
Dahasını keşfetmek için kurcalayın derim :))&lt;/p&gt;

</description>
      <category>gui</category>
      <category>ux</category>
      <category>gtk</category>
      <category>design</category>
    </item>
  </channel>
</rss>
