Bu makale, Veri Bilimi Blogathon
Giriş
Python kodundan MySQL sunucusuna SQL sorgularının nasıl yapılacağına dair pratik bir örneğe bakalım: CREATE, SELECT, UPDATE, JOIN, vb.
Çoğu uygulama, bir biçimde verilerle etkileşime girer. Bu nedenle, programlama dilleri (Python bir istisna değildir) veri kaynaklarını depolamak ve bunlara erişmek için araçlar sağlar. MySQL, en fantastik ve zengin veritabanı yönetim sistemlerinden (DBMS) biridir. Geçen yıl veritabanı sıralamasında Oracle'dan sonra ikinci sırada yer aldı.
Bu öğreticide açıklanan teknikleri kullanarak bir MySQL veritabanını Python uygulamanıza etkin bir şekilde entegre edebilirsiniz. Bu eğitimde, bir film derecelendirme sistemi için küçük bir MySQL veritabanı geliştireceğiz ve Python kodunu kullanarak ondan nasıl veri alınacağını öğreneceğiz.
Bu eğitimden sonra öğrenecekleriniz:
-
Uygulamanızı MySQL veritabanına bağlayın
-
Veritabanından gerekli veriler için bir sorgu aracılığıyla verilerin alınması
-
Veritabanına erişirken atılan istisnaları ele alın
Bu öğreticiden en iyi şekilde yararlanmak için döngü, işlevler ve istisna işleme gibi Python kavramları hakkında çalışma bilgisine sahip olmanız önerilir. Ayrıca, ve gibi SQL sorguları hakkında da temel bir anlayışa sahip olmanız gerekir. SELECT DROP CREATE JOIN için
MySQL'i Başka Bir SQL Veritabanlarıyla Karşılaştırma
SQL, Yapılandırılmış Sorgu Dili anlamına gelir, ilişkisel veritabanlarını yönetmek için yaygın olarak kullanılan bir programlama dilidir. Çeşitli SQL tabanlı DBMS'leri duymuş olabilirsiniz: MySQL, PostgreSQL, SQLite ve SQL Server. Bu veritabanlarının tümü SQL standartlarına uygundur ancak ayrıntılarda farklılık gösterir.
Açık kaynak kodu sayesinde MySQL, SQL çözümlerinde hızla pazar lideri haline geldi. MySQL şu anda Google, LinkedIn, Uber, Netflix, Twitter ve daha pek çok ünlü teknoloji firması tarafından kullanılmaktadır.
Açık kaynak topluluğunun desteğinin yanı sıra MySQL'in başarısının başka nedenleri de var:
-
Kurulumu kolay- MySQL, kullanıcı dostu olacak şekilde tasarlanmıştır. Veritabanını oluşturmak ve özelleştirmek kolaydır. MySQL, Windows, macOS, Linux ve Solaris gibi büyük işletim sistemleri için kullanılabilir.
-
Hız- MySQL, hızlı bir veritabanı çözümü olarak tanınmaktadır. Bu DBMS ayrıca iyi ölçeklenir.
-
Kullanıcı hakları ve güvenlik - MySQL, parola güvenlik seviyeleri belirlemenize, kullanıcı hesaplarına ayrıcalıklar eklemenize ve kaldırmanıza olanak tanır. Kullanıcı hakları yönetimi, yapılandırma dosyalarını yönetmenin biraz beceri gerektirdiği PostgreSQL gibi diğer birçok DBMS'den çok daha basit görünüyor.
MySQL Sunucusunu ve MySQL Bağlayıcısını Kurma
MySQL Server ve MySQL Connector, bu eğitime başlamak için ihtiyacınız olan iki yazılımdır. MySQL Sunucusu, veritabanıyla çalışmak için gereken kaynakları sağlayacaktır. Sunucuyu başlattıktan sonra, MySQL Connector / Python kullanarak Python uygulamanızı sunucuya bağlayabilmelisiniz.
MySQL Sunucusunu Kurma
Resmi belgeler, MySQL Sunucusunu indirmek ve kurmak için önerilen yolları açıklar. Windows, macOS, Solaris, Linux ve çok daha fazlası dahil olmak üzere tüm popüler işletim sistemleri için talimatlar vardır.
Windows için en iyi seçeneğiniz MySQL yükleyicisini indirmek ve süreci kendisinin halletmesine izin vermektir. Kurulum Yöneticisi ayrıca MySQL sunucunuz için güvenlik ayarlarını yapılandırmanıza yardımcı olacaktır. Hesaplar sayfasında, kök hesap için bir parola girmeniz ve istenirse farklı ayrıcalıklara sahip başka kullanıcılar eklemeniz gerekecektir.
MySQL hesabı kurma
MySQL Workbench gibi diğer faydalı araçlar, yükleyiciler kullanılarak özelleştirilebilir. Bir işletim sistemine yüklemeye uygun bir alternatif, MySQL'i Docker kullanarak dağıtmaktır.
MySQL Bağlayıcı / Python Kurulumu
Veritabanı sürücüsü – bir uygulamanın bir DBMS'ye bağlanmasına ve onunla etkileşime girmesine izin veren yazılım. Bu sürücüler genellikle ayrı modüller olarak sağlanır. Tüm Python veritabanı sürücülerinin uyması gereken standart arayüz PEP 249'da açıklanmıştır. Sürücüyü (bağlayıcı) kurmak için paket yöneticisini kullanacağız: pip
pip kurulum mysql-bağlayıcı-python
pip, bağlayıcıyı o anda etkin olan ortama kuracaktır. Ayrı bir projeyle çalışmak için sanal bir ortam kurmanızı öneririz.
Python terminalinde aşağıdaki komutu çalıştırarak kurulum sonucunu kontrol edelim:
mysql.connector'ı içe aktar
import ifadesi hatasız çalışıyorsa, başarıyla yüklenmiştir ve kullanıma hazırdır. MySQL.bağlayıcı
MySQL sunucusuna bağlantı kurulması
MySQL, sunucu taraflı bir veritabanı yönetim sistemidir. Bir sunucu birden fazla veritabanı içerebilir. Veritabanı ile etkileşime geçmek için sunucuyla bir bağlantı kurmalıyız. MySQL tabanlı bir veritabanına sahip bir Python programı için adım adım etkileşim şöyle görünür:
-
MySQL sunucusuna bağlanıyoruz.
-
Yeni bir veritabanı oluşturuyoruz (gerekirse).
-
Veritabanına bağlanıyoruz.
-
SQL sorgusunu çalıştırıyoruz, sonuçları topluyoruz.
-
Tabloda değişiklik yapılmışsa veritabanına bilgi veriyoruz.
-
Son olarak, MySQL sunucusuyla olan bağlantıyı kapatmanız yeterlidir.
Uygulama ne olursa olsun, ilk adım uygulama ile veritabanını birbirine bağlamaktır.
Python'dan MySQL Sunucusuna Bağlanmak
Bağlantı kurmak için modülü kullanın. Bu işlev parametreleri alır ve bir nesne döndürür. Kimlik bilgileri, kullanıcıdan gelen girdinin bir sonucu olarak alınabilir: connect() mysql.connector ana bilgisayar kullanıcı parolası MySQLConnection
getpass'tan import getpass from mysql.connector import connect, Hata deneyin: connect( host="localhost", user = input ("Kullanıcı Adı:"), password = getpass ("Parola:"), ) as connection: print(connection ) hariç, Error as e: print(e)
Nesne, MySQL sunucusuna erişmek için kullanacağımız bir değişkende saklanır. Birkaç önemli nokta: MySQLConnection bağlantısı
-
Tüm veritabanı bağlantılarını bloklara sarın. Bu, istisnaları yakalamayı ve incelemeyi kolaylaştıracaktır. dene… hariç
-
Veritabanına erişimi tamamladıktan sonra bağlantıyı kapatmayı unutmayın. Kullanılmayan açık bağlantılar, beklenmeyen hatalara ve performans sorunlarına yol açar. Kod bunun için bağlam yöneticisini (… gibi… ile) kullanır.
-
Kimlik bilgilerini (kullanıcı adı ve parola) bir Python betiğine asla dize biçiminde yerleştirmemelisiniz. Bu kötü bir dağıtım uygulamasıdır ve ciddi bir güvenlik riski oluşturur. Yukarıdaki kod, oturum açma kimlik bilgilerinizi ister. Bunun için, girilen şifreyi gizlemek için yerleşik bir modül kullanılır.
Böylece programımız ile MySQL sunucusu arasında bir bağlantı kurduk. Şimdi yeni bir veritabanı oluşturmanız veya mevcut bir veritabanına bağlanmanız gerekiyor.
Yeni bir veritabanı oluştur
Örneğin bir adla yeni bir veritabanı oluşturmak için SQL deyimini çalıştırmanız gerekir: online_movie_rating
VERİTABANI OLUŞTUR online_movie_rating;
not
MySQL, bir ifadenin sonuna noktalı virgül ( 😉 koymanızı gerektirir. Ancak, MySQL Connector/Python, her sorgunun sonuna otomatik olarak bir noktalı virgül ekler.
Bir SQL sorgusu yürütmek için veritabanı kayıtlarına erişim sürecini özetleyen bir imlece ihtiyacımız var. MySQL Connector / Python, örneğine imleç de denilen ilgili bir sınıf sağlar. MySQLİmleç
Veritabanı oluşturma isteğimizi iletelim: online_movie_rating
deneyin: bağlantı olarak connect( host="localhost", user = input ("Kullanıcı adı:"), password = getpass ("Parola:"), ) ile: create_db_query = "CREATE DATABASE online_movie_rating", imleç olarak connection.cursor() ile : imleç.execute(create_db_query) hariç, Error as e: print(e)
İstek, bir değişkende bir dize olarak depolanır ve daha sonra yürütülmek üzere CREATE DATABASE create_db_query imleç.execute() öğesine iletilir.
Sunucuda aynı ada sahip bir veritabanı zaten varsa, bir hata mesajı alırız. Daha önce olduğu gibi aynı nesneyi kullanarak, veritabanında depolanan tüm tabloları görmek için bir sorgu çalıştıralım: MySQLConnection VERİTABANLARINI GÖSTER
deneyin: bağlantı olarak connect( host="localhost", user = input ("Kullanıcı adı:"), password = getpass ("Parola:"), ) ile: show_db_query = "VERİTABALARINI GÖSTER", imleç olarak connection.cursor() ile: imleçte db için imleç.execute(show_db_query): print(db) dışında Error as e: print(e)
ÇIKTI
Kullanıcı adını girin: kök
Parolanı Gir: ········
('bilgi_şema',)
('mysql',)
('online_movie_rating',)
('performans_şema',)
('sys',)
Yukarıdaki kod, MySQL sunucumuzda bulunan tüm veritabanlarının adlarını yazdıracaktır. Örneğimizdeki komut, MySQL sunucusu tarafından otomatik olarak oluşturulan ve veritabanı meta verilerine ve sunucu ayarlarına erişim sağlayan veritabanlarını da attı. VERİTABANLARINI GÖSTER
Mevcut bir veritabanına bağlanma
Böylece, adlı bir veritabanı oluşturduk. Buna bağlanmak için çağrıyı bir parametre ile tamamlamamız yeterlidir: online_movie_rating connect() database
deneyin: connect( host="localhost", user = input ("Kullanıcı adı:")), password = getpass ("Parola:"), database="online_movie_rating", ) ile bağlantı: print(connection) hariç, Error as e: yazdır(e)
Tabloları oluşturma, değiştirme ve bırakma
Bu bölümde, bazı temel sorguları gerçekleştirmek için Python'un nasıl kullanılacağını tartışacağız: ',' ve '.' TABLO DROP ALTER OLUŞTUR
Veritabanı şemasını tanımlama
Film derecelendirme sistemi için bir veritabanı şeması oluşturarak başlayalım. Üç tablodan oluşan veritabanını alın:
1. filmler- filmler hakkında genel bilgiler:
-
Id
-
+
-
başlık
-
çıkış tarihi
-
tarz
-
koleksiyon_in_mi
2. yorumcular- filmlerin derecelendirmelerini yayınlayan kişiler hakkında bilgi:
-
id
-
İsim
-
soyadı
3. reytingler- filmlerin yorumcular tarafından reytingleri hakkında bilgi:
-
movie_id (yabancı anahtar)
-
incelemeci_id (yabancı anahtar)
-
değerlendirme
Bu üç tablo bu kılavuzun amaçları için yeterlidir.
Film derecelendirme sistemi şeması
Veritabanındaki tablolar birbiriyle ilişkilidir: filmler ve yorumcular çoktan çoğa ilişkiye sahip olmalıdır: bir film birden fazla gözden geçiren tarafından görüntülenebilir ve bir gözden geçiren birden fazla filmi inceleyebilir. Tablo derecelendirmeleri, filmler tablosunu gözden geçirenin masasına bağlar.
CREATE TABLE deyimini kullanarak tablo oluşturma
MySQL'de yeni bir tablo oluşturmak için operatörü kullanmamız gerekiyor. Aşağıdaki MySQL sorgusu veritabanı tablomuzu oluşturacaktır: CREATE TABLE filmler online_movie_rating
CREATE TABLE filmler( id INT AUTO_INCREMENT PRIMARY KEY, başlık VARCHAR(100), yayın_yılı YEAR(4), tür VARCHAR(100), collection_in_mil INT );
Daha önce SQL ile karşılaştıysanız yukarıdaki sorgunun anlamını anlayacaksınız. MySQL lehçesinin bazı ayırt edici özellikleri vardır. Örneğin MySQL, vb. dahil olmak üzere çok çeşitli veri türleri sunar. Ayrıca MySQL, yeni kayıtlar eklendiğinde sütun değerinin otomatik olarak artırılması gerektiğinde anahtar kelimeyi kullanır. YIL INT BIGINT AUTO_INCREMENT
Bir tablo oluşturmak için belirtilen sorguyu imleç.execute() öğesine iletmeniz gerekir.
create_movies_table_query = """ CREATE TABLE filmler( id INT AUTO_INCREMENT PRIMARY KEY, başlık VARCHAR(100), release_year YEAR(4), tür VARCHAR(100), collection_in_mil INT ) """, imleç olarak connection.cursor() ile """: imleç. çalıştır(create_movies_table_query) connection.commit()
Operatöre dikkat edin. Varsayılan olarak, MySQL bağlayıcısı işlemleri otomatik olarak gerçekleştirmez. MySQL'de, bir işlemde bahsedilen değişiklikler yalnızca sonunda komutu kullandığımızda gerçekleşir. Bir tabloda değişiklik yapmak için, her işlemden sonra daima bu yöntemi çağırın. bağlantı.commit() KOMİTE
Tablo için prosedürü tekrarlayalım: gözden geçirenler
create_reviewers_table_query = “””
CREATE TABLE gözden geçirenler ( id INT AUTO_INCREMENT PRIMARY KEY, ad VARCHAR(100), soyadı VARCHAR(100) ) """, imleç olarak connection.cursor() ile: imleç.execute(create_reviewers_table_query) connection.commit() Son olarak, bir tablo derecelendirmeleri: create_ratings_table_query = """ TABLO derecelendirmeleri OLUŞTUR ( movie_id INT, incelemeci_id INT, derecelendirme DECIMAL(2,1), YABANCI ANAHTAR(movie_id) REFERANSLAR filmler(id), YABANCI ANAHTAR(reviewer_id) REFERANSLAR gözden geçirenler(id), BİRİNCİL ANAHTAR (movie_id, inceleme_id) ) """ imleç olarak connection.cursor() ile: imleç.execute(create_ratings_table_query) connection.commit()
MySQL'de yabancı anahtar ilişkilerinin uygulanması biraz farklıdır ve standart SQL ile karşılaştırıldığında sınırlamaları vardır. MySQL'de, bir yabancı anahtarın hem üst öğesi hem de alt öğesi, aynı depolama motorunu - veritabanı yönetim sisteminin SQL işlemlerini gerçekleştirmek için kullandığı temel yazılım bileşenini kullanmalıdır. MySQL, bu tür iki tür mekanizma sunar:
-
İşlemsel depolama motorları işlem açısından güvenlidir ve gibi basit komutları kullanarak işlemleri geri almanıza olanak tanır. InnoDB ve NDB dahil olmak üzere birçok popüler MySQL motoru bu kategoriye girer. geri alma
-
İşlemsel olmayan depolama motorları, veritabanına taahhüt edilen ifadeleri geri almak için manuel koda güvenir. Bunlar örneğin MyISAM ve MEMORY'dir.
InnoDB en popüler varsayılan depolama motorudur. Yabancı anahtar kısıtlamaları uygulayarak veri bütünlüğünün korunmasına yardımcı olur. Bu, farklı tablolar arasında tutarsızlığa yol açmadığından emin olmak için herhangi bir yabancı anahtar CRUD işleminin önceden kontrol edildiği anlamına gelir.
Tablonun, birlikte birincil anahtar olarak hareket eden sütunları ve iki yabancı anahtarı kullandığını unutmayın. Bu özellik, bir eleştirmenin aynı filmi iki kez oylamamasını sağlar. oylar movie_id incelemeci_id
Aynı imleç birden fazla vuruş için kullanılabilir. Bu durumda, tüm çağrılar tek bir atomik işlem haline gelecektir. Örneğin, tüm ifadeleri tek bir imleçle yürütebilir ve ardından işlemi bir kerede gerçekleştirebilirsiniz:
imleç olarak connection.cursor() ile TABLO OLUŞTUR: imleç.execute(create_movies_table_query) imleç.execute(create_reviewers_table_query) imleç.execute(create_ratings_table_query) connection.commit()
DESCRIBE İfadesini Kullanarak Tablo Şemasını Görüntüleme
Üç tablo oluşturduk ve operatörü kullanarak şemayı görüntüleyebiliriz. BETİMLEMEK
Bir değişkende zaten bir nesneniz olduğunu varsayarsak, elde edilen sonuçları yazdırabiliriz. Bu yöntem, son yürütülen ifadeden tüm satırları alır: MySQLConnection bağlantı imleç.fetchall()
show_table_query = imleç olarak connection.cursor() ile "filmleri AÇIKLA": imleç.execute(show_table_query) # Son yürütülen sorgudan satırları getir sonuçtaki satır için imleç.fetchall(): print(row)
ÇIKTI
('id', 'int(11)', 'HAYIR', 'PRI', Yok, 'auto_increment')
('başlık', 'varchar(100)', 'EVET', ”, Yok, ”)
('release_year', 'year(4)', 'EVET', ”, Yok, ”)
('tür', 'varchar(100)', 'EVET', ”, Yok, ”)
('collection_in_mil', 'int(11)', 'EVET', ”, Yok, ”)
Yukarıdaki kodu çalıştırdıktan sonra, tablodaki sütunlar hakkında bilgi içeren bir tablo almalıyız. Her sütun için, veri türü, sütunun birincil anahtar olup olmadığı vb. hakkında bilgiler görüntülenir. filmler
ALTER deyimini kullanarak bir tablonun şemasını değiştirme
Tablodaki ad sütunu, filmin milyonlarca dolarlık gişesini içerir. Bir özniteliğin veri türünü collection_in_mil movies collection_in_mil INT DECIMAL olarak değiştirmek için aşağıdaki MySQL ifadesini yazabiliriz.
ALTER TABLE filmler MODIFY COLUMN collection_in_mil DECIMAL(4,1);
DECIMAL(4,1) en fazla dört rakama sahip olabilen bir ondalık sayıyı belirtir; bunlardan biri örneğin onuncu deşarja karşılık gelir vb. NS. 120.1 3.4 38.0
alter_table_query = """ TABLO filmlerini ALTER MODIFY COLUMN collection_in_mil DECIMAL(4,1) """ show_table_query = "Filmleri AÇIKLA", connection.cursor() imleç olarak: imleç.execute(alter_table_query) imleç.execute (show_table_query) # Satırları al son yürütülen sorgudan sonuç = imleç.fetchall () print ("Değişiklik sonrası film tablosu şeması:") sonuç satırı için: print(row) Değişiklik yaptıktan sonra film tablosu şeması: ('id', 'int(11) ', 'HAYIR', 'PRI', Yok, 'auto_increment') ('title', 'varchar(100)', 'EVET', '', Yok, '') ('release_year', 'year(4) ', 'EVET', '', Yok, '') ('tür', 'varchar(100)', 'EVET', '', Yok, '') ('collection_in_mil', 'decimal(4,1) ', 'EVET', '', Yok, '')
Çıktıda gösterildiği gibi, öznitelik de türünü değiştirdi. Yukarıdaki kodda iki kez çağırdığımızı, ancak yalnızca en son yürütülen sorgudan satırları getirdiğini unutmayın. collection_in_mil DECIMAL(4,1) imleç.execute() imleç.fetchall() show_table_query
DROP deyimini kullanarak tabloları bırakma
Tabloları silmek için operatörü kullanın. Bir tabloyu bırakmak geri dönüşü olmayan bir işlemdir. Aşağıdaki kodu çalıştırırsanız, tablodaki sorguyu tekrar çağırmanız gerekecektir: DROP TABLE CREATE TABLE Ratings
drop_table_query = imleç olarak connection.cursor() ile "DROP TABLE derecelendirmeleri": imleç.execute(drop_table_query)
Tablolara kayıt ekleme
Tabloları verilerle dolduralım. Bu bölümde, Python kodunda MySQL Connector kullanarak kayıt eklemenin iki yolunu inceleyeceğiz.
İlk yöntem, kayıt sayısı az olduğunda iyi çalışır. İkincisi, gerçek hayat senaryoları için daha uygundur. .execute() .executemany()
.execute () ile kayıt ekleme
İlk yaklaşım, şu ana kadar kullandığımız yöntemin aynısını kullanır. Bir istek yazıp bunu imleç.execute() 'e INSERT INTO imleç.execute()'e gönderiyoruz.
insert_movies_query = """ Filmlere EKLE (başlık, yayın_yılı, tür, koleksiyon_in_mil) DEĞERLER ("Forrest Gump", 1994, "Drama", 330.2), ("3 Aptal", 2009, "Drama", 2.4), (" Eternal Sunshine of the Spotless Mind", 2004, "Drama", 34.5), ("İyi Niyet Avı", 1997, "Drama", 138.1), ("Skyfall", 2012, "Aksiyon", 304.6), ("Gladyatör" ", 2000, "Aksiyon", 188.7) ("Siyah", 2005, "Drama", 3.0), ("Titanic", 1997, "Romantik", 659.2), ("Esaretin Bedeli", 1994, "Drama" ",28.4), ("Udaan", 2010, "Drama", 1.5), ("Evde Tek Başına", 1990, "Komedi", 286.9), ("Kazablanka", 1942, "Romantik", 1.0), (" Yenilmezler: Endgame", 2019, "Aksiyon", 858.8), ("Yaşayan Ölülerin Gecesi", 1968, "Korku", 2.5), ("The Godfather", 1972, "Suç", 135.6), ("Haider" ", 2014, "Aksiyon", 4.2), ("Başlangıç", 2010, "Macera", 293.7), ("Kötülük", 2003, "Korku", 1.3), ("Oyuncak Hikayesi 4", 2019, "Animasyon" ", 434.9), ("Air Force One", 1997, "Drama", 138.1), ("Kara Şövalye", 2008, "Aksiyon",535.4), ("Bhaag Milkha Bhaag", 2013, "Spor", 4.1), ("T Aslan Kral", 1994, "Animasyon", 423.6), ("Ucuz Roman", 1994, "Suç", 108.8), ("Kai Po Che", 2013, "Spor", 6.0), ("Beasts of No Ulus", 2015, "Savaş", 1.4), ("Andadhun", 2018, "Gerilim", 2.9), ("Kuzuların Sessizliği", 1991, "Suç", 68.2), ("Deadpool", 2016 , "Action", 363.6), ("Drishyam", 2015, "Gizem", 3.0) """, imleç olarak connection.cursor() ile: imleç.execute(insert_movies_query) connection.commit()
Tablo şimdi otuz kayıtla dolu. Sonunda, kod çağırır. Tabloda herhangi bir değişiklik yaptıktan sonra aramayı unutmayınız. filmler bağlantısı.commit() .commit()
.executemany () ile kayıt ekleme
Önceki yaklaşım, kod aracılığıyla kolayca eklenebilen daha küçük kayıtlar için çok uygundur. Ancak genellikle veriler bir dosyada saklanır veya başka bir komut dosyası tarafından oluşturulur. İşte burada işe yarar. Yöntem iki parametre alır: .executemany()
-
Eklenecek kayıtlar için yer tutucuları içeren bir sorgu.
-
Eklenecek kayıtların listesi.
Tabloyu doldurmak için bir yaklaşım yapalım: gözden geçirenler
insert_reviewers_query = """ İnceleyenlere EKLE (ad, soyadı) DEĞERLER ( %s, %s ) """ Reviewers_records = [ ("Chaitanya", "Baweja"), ("Mary", "Cooper"), ("John" ", "Wayne"), ("Thomas", "Stoneman"), ("Penny", "Hofstadter"), ("Mitchell", "Marsh"), ("Wyatt", "Skaggs"), ("Andre") ", "Veiga"), ("Sheldon", "Cooper"), ("Kimbra", "Ustalar"), ("Kat", "Dennings"), ("Bruce", "Wayne"), ("Domingo" ", "Cortes"), ("Rajesh", "Koothrappali"), ("Ben", "Glocker"), ("Mahinder", "Dhoni"), ("Akbar", "Khan"), ("Howard" ", "Wolowitz"), ("Pinkie", "Petit"), ("Gurkaran", "Singh"), ("Amy", "Farah Fowler"), ("Marlon", "Crafford"), ] ile imleç olarak connection.cursor(): imleç.executemany(insert_reviewers_query, gözden geçirenler_records) connection.commit()
Bu kod, içine eklenen iki dize için yer tutucular alır. Yer tutucular, biçim belirteçleri olarak işlev görür ve bir dize içindeki bir değişken için yer ayırmaya yardımcı olur. %s insert_reviewers_query
Tabloyu aynı şekilde dolduralım: derecelendirmeler
insert_ratings_query = """ DEĞERLERE EKLE (derecelendirme, movie_id, incelemeci_id) DEĞERLER ( %s, %s, %s) """ Rating_records = [ (6.4, 17, 5), (5.6, 19, 1), (6.3) , 22, 14), (5.1, 21, 17), (5.0, 5, 5), (6.5, 21, 5), (8.5, 30, 13), (9.7, 6, 4), (8.5, 24) , 12), (9.9, 14, 9), (8.7, 26, 14), (9.9, 6, 10), (5.1, 30, 6), (5.4, 18, 16), (6.2, 6, 20) ), (7.3, 21, 19), (8.1, 17, 18), (5.0, 7, 2), (9.8, 23, 3), (8.0, 22, 9), (8.5, 11, 13), (5.0, 5, 11), (5.7, 8, 2), (7.6, 25, 19), (5.2, 18, 15), (9.7, 13, 3), (5.8, 18, 8), (5.8) , 30, 15), (8.4, 21, 18), (6.2, 23, 16), (7.0, 10, 18), (9.5, 30, 20), (8.9, 3, 19), (6.4, 12) , 2), (7.8, 12, 22), (9.9, 15, 13), (7.5, 20, 17), (9.0, 25, 6), (8.5, 23, 2), (5.3, 30, 17 ), (6.4, 5, 10), (8.1, 5, 21), (5.7, 22, 1), (6.3, 28, 4), (9.8, 13, 1) ] imleç olarak connection.cursor() ile : imleç.executemany(insert_ratings_query, Rating_records) connection.commit()
Her üç tablo da artık verilerle dolu. Bir sonraki adım, bu veritabanıyla nasıl etkileşime girileceğini bulmaktır.
Veritabanından kayıtları okuma
Şimdiye kadar sadece veritabanı öğeleri oluşturduk. Birkaç sorgu çalıştırıp ilgilendiğimiz özellikleri bulmanın zamanı geldi. Bu bölümde, operatörü kullanarak veritabanı tablolarından kayıtları nasıl okuyacağımızı öğreneceğiz. SEÇME
SELECT deyimi ile kayıtları okuma
Kayıtları almak için, isteğe göndermeniz ve şunu kullanarak sonucu döndürmeniz gerekir: imleç.execute() SELECT imleç.fetchall()
select_movies_query = "SELECT * FROM FROM FROM FROM FROM FROM FIM LIMIT 5", imleç olarak connection.cursor() ile: imleç olarak imleç.execute(select_movies_query) sonuç = imleç.fetchall() sonuç satırı için: print(row)
ÇIKTI
(1, 'Forrest Gump', 1994, 'Drama', Ondalık('330.2'))
(2, '3 Aptal', 2009, 'Drama', Ondalık('2.4'))
(3, 'Lekesiz Aklın Ebedi Güneş Işığı', 2004, 'Drama', Ondalık('34.5'))
(4, 'İyi Niyet Avı', 1997, 'Drama', Ondalık('138.1'))
(5, 'Skyfall', 2012, 'Eylem', Ondalık('304.6'))
Değişken, döndürülen kayıtları içerir. Bir tablodaki bireysel kayıtları temsil eden demetlerin bir listesidir. sonuç .fetchall()
Yukarıdaki sorguda, operatörden alınan satır sayısını sınırlamak için bir anahtar kelime kullanıyoruz. Geliştiriciler genellikle büyük miktarda veri işlerken çıktıları sayfalamak için kullanılır. LIMIT SEÇ LIMIT
MySQL'de, bir operatöre negatif olmayan iki sayısal argüman iletilebilir: LIMIT
SEÇ * LIMIT 2,5 filmlerinden;
İki sayısal bağımsız değişken kullanırken, ilki bu örnekte 2 olan bir uzaklığı belirtir ve ikincisi 5'e döndürülen satır sayısını sınırlar. Yani, örnekteki sorgu 3 ile 7 arasındaki satırları döndürür.
select_movies_query = "Başlık SEÇ, filmlerden LIMIT 2, 5 yayın_yılı" imleç olarak connection.cursor() ile: imleç.fetchall() içindeki satır için imleç.execute(select_movies_query): print(row)
ÇIKTI
('Lekesiz Aklın Ebedi Güneş Işığı', 2004)
('İyi Niyet Avı', 1997)
('Skyfall', 2012)
('Gladyatör', 2000)
('Siyah', 2005)
Sonuçları WHERE ile Filtreleme
Tablo girişleri kullanılarak da filtrelenebilir. 300 milyon doların üzerinde gişe hasılatı olan tüm filmleri almak için aşağıdaki sorguyu çalıştırın: WHERE
select_movies_query = """ Başlık SEÇ, collection_in_mil FROM FROM FROM FROM FROM FROM FROM NEREDE collection_in_mil > 300 ORDER BY collection_in_mil DESC """, connection.cursor() ile imleç olarak: imleç.fetchall() içindeki film için imleç.execute(select_movies_query): print(movie) ('Yenilmezler: Oyun Sonu', Ondalık('858.8')) ('Titanik', Ondalık('659.2')) ('Kara Şövalye', Ondalık('535.4')) ('Oyuncak Hikayesi 4', Ondalık(' 434.9')) ('Aslan Kral', Ondalık('423.6')) ('Deadpool', Ondalık('363.6')) ('Forrest Gump', Ondalık('330.2')) ('Skyfall', Ondalık( '304.6'))
Sorgudaki ifade, ücretleri en yüksekten en düşüğe sıralamanıza olanak tanır. TARAFINDAN SİPARİŞ
MySQL, dize birleştirme gibi birçok dize biçimlendirme işlemi sağlar. Örneğin, karışıklığı önlemek için film başlıkları genellikle yayın yılı ile birlikte görüntülenir. En karlı beş filmin isimlerini vizyon tarihleriyle birlikte alalım: CONCAT
select_movies_query = """ CONCAT (başlık, " (", release_year, ")"), collection_in_mil FROM filmlerden SİPARİŞ BY collection_in_mil DESC LIMIT 5 """, imleç olarak connection.cursor() ile: film için imleç.execute(select_movies_query) imleç.fetchall() içinde: yazdır(film)
ÇIKTI
('Yenilmezler: Oyunsonu (2019)', Ondalık('858.8'))
('Titanik (1997)', Ondalık('659.2'))
('Kara Şövalye (2008)', Ondalık('535.4'))
('Oyuncak Hikayesi 4 (2019)', Ondalık('434.9'))
('Aslan Kral (1994)', Ondalık('423.6'))
Kullanmak istemiyorsanız ve tüm kayıtları almanız gerekmiyorsa, imleç yöntemlerini kullanabilirsiniz ve: LIMIT .fetchone() .fetchmany()
-
.fetchone() Sonucun sonraki satırını bir tanımlama grubu olarak veya başka satır yoksa alır. Hiçbiri
-
.fetchmany() Bir sonraki satır kümesinin listesini bir tanımlama grubu olarak alır. Bunu yapmak için, varsayılan olarak 1 olan bir argüman iletilir. Kullanılabilir başka satır yoksa, yöntem boş bir liste döndürür.
Yine, yıllara göre en yüksek hasılat yapan beş filmin başlıklarını çıkarın, ancak bu sefer şunu kullanın: .fetchmany()
select_movies_query = """ CONCAT(title, " (", release_year, ")"), collection_in_mil FROM filmlerden SİPARİŞ BY collection_in_mil DESC """ ile connection.cursor() imleç olarak: imleç içindeki film için imleç.execute(select_movies_query) .fetchmany(boyut=5): yazdır(film) imleç.fetchall()
ÇIKTI
('Yenilmezler: Oyunsonu (2019)', Ondalık('858.8'))
('Titanik (1997)', Ondalık('659.2'))
('Kara Şövalye (2008)', Ondalık('535.4'))
('Oyuncak Hikayesi 4 (2019)', Ondalık('434.9'))
('Aslan Kral (1994)', Ondalık('423.6'))
Ek bir zorluk fark etmiş olabilirsiniz. Bunu, kalan okunmamış sonuçları temizlemek için yaparız. imleç.fetchall() .fetchmany()
Aynı bağlantı üzerinde başka ifadeler yürütmeden önce, okunmamış sonuçları temizlemelisiniz. Aksi takdirde, bir istisna atılır. İç hata
Birden Fazla Tabloya KATILIN
En yüksek puan alan beş filmin adlarını bulmak için aşağıdaki sorguyu çalıştırın:
select_movies_query = """ Başlık SEÇ, ortalama_rating olarak AVG(rating) FROM Rating'den INNER FROM ON movie.id = Rating.movie_id GROUP BY movie_id ORDER BY ortalama_rating DESC LIMIT 5 """, imleç olarak connection.cursor() ile """: imleç. imleç.fetchall() içindeki film için yürüt(select_movies_query): print(movie)
ÇIKTI
('Yaşayan Ölülerin Gecesi', Ondalık('9.90000'))
('Baba', Ondalık('9.90000'))
('Yenilmezler: Oyun Sonu', Ondalık('9.75000'))
('Lekesiz Aklın Ebedi Güneş Işığı', Ondalık('8.90000'))
('Hiçbir Ulusun Canavarları', Ondalık('8.70000'))
En çok puan alan yorumcunun adını şu şekilde bulabilirsiniz:
select_movies_query = """ CONCAT(first_name, " ", last_name), COUNT(*) as num FROM gözden geçirenlerden INNER JOIN derecelendirmeleri ON yorumcular.id = rating.reviewer_id GROUP BY incelemeci_id SİPARİŞ NUMARASI DESC LIMIT 1 """ bağlantı ile. imleç olarak imleç(): imleç.fetchall() içindeki film için imleç.execute(select_movies_query): print(movie) ('Mary Cooper', 4)
Gördüğünüz gibi, incelemelerin çoğu Mary Cooper tarafından yazılmıştır.
Bir sorgu yürütme süreci her zaman aynı kalır: kullanarak sonuçları almak için sorguyu iletiriz. imleç.execute() .fetchall()
Veritabanından kayıtların güncellenmesi ve silinmesi
Bu bölümde, bazı girişleri güncelleyip kaldıracağız. Bir anahtar kelime kullanarak gerekli satırları seçeceğiz. NEREDE
GÜNCELLEME komutu
Bir eleştirmen Amy Farah Fowler'ın Sheldon Cooper ile evli olduğunu hayal edin. Soyadını Cooper olarak değiştirdi ve veritabanını güncellememiz gerekiyor. MySQL'deki kayıtları güncellemek için şu operatörü kullanın: UPDATE
update_query = """ UPDATE gözden geçirenler SET last_name = "Cooper" WHERE first_name = "Amy" """, imleç olarak connection.cursor() ile: imleç.execute(update_query) connection.commit()
Kod, güncelleme isteğini tabloya iletir ve gerekli değişiklikleri yapar. imleç.execute() .commit() gözden geçirenler
Diyelim ki gözden geçirenlerin notları değiştirmesine izin vermek istiyoruz. Programın bilmesi gerekiyor ve yeni. SQL örneği: movie_id incelemeci_id derecelendirmesi
GÜNCELLEME derecelendirmeleri SET derecelendirmesi = 5.0 WHERE movie_id = 18 VE Reviewer_id = 15; * SEÇİMİ movie_id = 18 VE gözden geçiren_id = 15; Belirtilen sorgular önce derecelendirmeyi günceller ve ardından güncellenmiş olanı verir. Notları ayarlamamıza izin verecek bir Python betiği yazalım: getpass'tan change_ratings.py import getpass from mysql.connector import connect, Error movie_id = input("Film kimliğini girin: ") inceleme_id = input("İnceleyici kimliğini girin: " ) new_rating = input("Yeni derecelendirme girin: ") update_query = """ Derecelendirmeleri GÜNCELLE SET derecelendirmesi = "%s" WHERE movie_id = "%s" AND Reviewer_id = "%s"; SEÇ * NEREDE Oylamalardan movie_id = "% s" AND Reviewer_id = "%s" """ % ( new_rating, movie_id, Reviewer_id, movie_id, Reviewer_id, ) deneyin: connect( host="localhost", user=input("Kullanıcı adını girin: "), password=getpass ("Şifreyi girin: "), database="online_movie_rating", ) bağlantı olarak: imleç olarak connection.cursor() ile: imleç olarak sonuç için.execute(update_query, multi=True): if result.with_rows: print(result. fetchall()) connection.commit() dışında Error as e: print(e)
ÇIKTI
Film kimliğini girin: 18
İnceleyen kimliğini girin: 15
Yeni derecelendirme girin: 5
Kullanıcı adını girin: kök
Parolanı Gir: ········
[(18, 15, Ondalık('5.0'))]
Aynı imlece birden fazla istek iletmek için argümana bir değer atarız. Bu durumda, bir yineleyici döndürür. Yineleyicideki her öğe, istekte iletilen talimatı yürüten bir imleç nesnesine karşılık gelir. Yukarıdaki kod, bu yineleyicide her imleç nesnesini çağıran bir döngü başlatır. .fetchall() için çoklu True imleç.execute()
İşlem için sonuç kümesi elde edilmemişse, bir istisna atılır. Bu hatayı önlemek için yukarıdaki kodda son yapılan işlemin satır oluşturup oluşturmadığını gösteren bir özellik kullanıyoruz. .fetchall() imleç.with_rows
Bu kod işi yaparken, talimat, olduğu gibi, bilgisayar korsanları için cazip bir hedeftir. Saldırganların veritabanını bozmasına veya kötüye kullanmasına izin verebilecek bir SQL enjeksiyon saldırısına karşı savunmasızdır. NEREDE
Örneğin, kullanıcı girdi olarak gönderirse sonuç şöyle görünür: movie_id = 18 incelemeci_id = 15 oylama = 5.0
$ python change_ratings.py
Film kimliğini girin: 18
İnceleyen kimliğini girin: 15
Yeni derecelendirme girin: 5.0
Kullanıcı adı girin:
Parolanı Gir:
[(18, 15, Ondalık('5.0'))]
Skor ve çok değişti. Ancak bir bilgisayar korsanıysanız, girişe gizli bir komut gönderebilirsiniz: movie_id = 18 inceleme_id = 15 5.0
$ python change_ratings.py
Film kimliğini girin: 18
İnceleyen kimliğini girin: 15″; GÜNCELLEME gözden geçirenler SET last_name = “A
Yeni derecelendirme girin: 5.0
Kullanıcı adı girin:
Parolanı Gir:
[(18, 15, Ondalık('5.0'))]
Yine, çıktı, bildirilen derecelendirmenin 5.0 olarak değiştirildiğini gösteriyor. Ne değişti?
Bilgisayar korsanı, veri güncelleme isteğini ele geçirdi. Bir güncelleme isteği, gözden geçirenin tablosundaki tüm kayıtları değiştirir: last_name “A”
>>> select_query = “””
… ad, soyadı SEÇ
… gözden geçirenlerden
… “””
>>> imleç olarak connection.cursor() ile:
… imleç.execute(select_query)
… imleç.fetchall() içindeki gözden geçiren için:
… yazdır(inceleyen)
...
('Chaitanya', 'A')
('Meryem', 'A')
('John', 'A')
('Thomas', 'A')
('Penny', 'A')
('Mitchell', 'A')
('Wyatt', 'A')
('Andre', 'A')
('Sheldon', 'A')
('Kimbra', 'A')
('Kat', 'A')
('Bruce', 'A')
('Domingo', 'A')
('Rajesh', 'A')
('Ben', 'A')
('Mahinder', 'A')
('Ekber', 'A')
('Howard', 'A')
('Pembe', 'A')
('Gürkaran', 'A')
('Amy', 'A')
('Marlon', 'A')
Yukarıdaki kod, gözden geçirenler tablosundaki tüm kayıtları görüntüler. Bir SQL enjeksiyon saldırısı bu tabloyu bozdu ve tüm kayıtları “A” olarak değiştirdi. ad soyad soyad soyad
Bu tür saldırıları önlemek için hızlı bir çözüm var. Kullanıcı tarafından sağlanan sorgu değerlerini doğrudan sorgu dizesine eklemeyin. .execute() işlevine argüman olarak istek değerleri göndererek komut dosyasını güncellemek daha iyidir.
change_ratings.py getpass'tan import getpass from mysql.connector import connect, Hata movie_id = input("Film kimliğini girin: ") inceleme_id = input("İnceleyici kimliğini girin: ") new_rating = input("Yeni derecelendirme girin: ") update_query = """ Derecelendirmeleri GÜNCELLE SET derecelendirmesi = %s movie_id = %s VE incelemeci_id = %s; SEÇ * Oylamalardan NEREDE movie_id = %s VE incelemeci_id = %s """ val_tuple = ( new_rating, movie_id, incelemeci_id, movie_id, incelemeci_id , ) deneyin: connect( host="localhost", user=input("Kullanıcı adını girin: "), password=getpass("Şifreyi girin: "), database="online_movie_rating", ) bağlantı olarak: ile connection.cursor( ) imleç olarak: imleç.execute(update_query, val_tuple, multi=True) içinde sonuç için: if result.with_rows: print(result.fetchall()) connection.commit() hariç Error as e: print(e)
Yer tutucuların artık dize tırnak içine alınmadığını unutmayın. bağımsız değişken olarak verilen tanımlama grubundaki değerlerin gerekli veri türünde olduğunu doğrular. Kullanıcı bazı sorunlu karakterler girmeye çalışırsa, kod bir istisna atar: %s imleç.execute()
ÇIKTI
$ python change_ratings.py
Film kimliğini girin: 18
İnceleyen kimliğini girin: 15″; GÜNCELLEME gözden geçirenler SET last_name = “A
Yeni derecelendirme girin: 5.0
Kullanıcı adı girin:
Parolanı Gir:
1292 (22007): Yanlış DOUBLE değeri kesildi: '15”;
Bir isteğe kullanıcı girdisi eklediğinizde bu yaklaşım her zaman kullanılmalıdır. SQL enjeksiyon saldırılarını önlemenin diğer yollarını öğrenmek için zaman ayırın.
Kayıtların silinmesi: DELETE komutu
Kayıtları silme prosedürü, onları güncellemeye çok benzer. Bu geri alınamaz bir işlem olduğundan, istediğiniz kayıtları sildiğinizden emin olmak için önce sorguyu aynı filtre ile çalıştırmanızı öneririz. Örneğin, tüm film derecelendirmelerini, verileri kaldırmak için önce uygun sorguyu çalıştırabiliriz: DELETE SELECT incelemeci_id = 7 SELECT
select_movies_query = """ Reviewer_id, movie_id DEĞERLENDİRME SEÇİN NEREDE Review_id = 7 """, imleç olarak connection.cursor() ile: imleç.fetchall() içindeki film için imleç.execute(select_movies_query): print(movie)
ÇIKTI
(2, 7)
(2, 8)
(2, 12)
(2, 23)
Yukarıdaki kod parçacığı, bir çifti ve tablodaki girişler için tahminleri görüntüler. Silinecek kayıtların bunlar olduğundan emin olduktan sonra aynı filtre ile sorguyu çalıştıralım: Reviewer_id movie_id Reviewer_id = 2 DELETE
delete_query = imleç olarak connection.cursor() ile "reviewer_id = 2 NEREDE derecelendirmelerden SİL": imleç.execute(delete_query) connection.commit()
Python ve MySQL'i bağlamanın diğer yolları
Bu öğreticide, bir Python uygulamasından bir MySQL veritabanıyla etkileşim kurmanın resmi olarak önerilen yolu olan MySQL Bağlayıcı / Python'u tanıttık. İşte diğer birkaç popüler konektör:
-
mysqlclient, resmi bağlayıcıya rakip olan ve aktif olarak yeni işlevlerle desteklenen bir kitaplıktır. Kütüphanenin çekirdeği C ile yazıldığından, resmi saf Python konektöründen daha iyi performansa sahiptir. En büyük dezavantajı, mysqlclient'in özellikle Windows'ta kurulmasının ve yüklenmesinin oldukça zor olmasıdır.
-
MySQLdb, bugün hala ticari uygulamalarda kullanılan eski bir yazılımdır. C ve daha hızlı MySQL Connector / Python ile yazılmıştır, ancak yalnızca Python 2 için mevcuttur.
Bu sürücüler, programınız ve MySQL veritabanı arasında arayüz görevi görür. Aslında, SQL sorgularınızı bunlar aracılığıyla göndermeniz yeterlidir. Ancak, birçok geliştirici veri yönetimi için SQL sorguları yerine nesne yönelimli paradigmayı kullanmayı tercih eder.
Nesne-ilişkisel eşleme ( ORM ), yalnızca sorguya değil, aynı zamanda doğrudan OOP'leri kullanarak bir veritabanındaki verilerin işlenmesine de izin veren bir süreçtir. ORM kitaplığı, verileri işlemek için gereken kodu içine alır ve geliştiricileri SQL sorgularını kullanma ihtiyacından kurtarır. Python ve SQL'i birleştirmek için en popüler ORM kitaplıkları şunlardır:
-
SQLAlchemy, Python ve diğer SQL veritabanları arasındaki iletişimi basitleştiren bir ORM'dir. MySQL, PostgreSQL, SQLite gibi farklı veritabanları için farklı motorlar oluşturabilirsiniz.
-
peewee, basit bir konfigürasyona sahip hafif ve hızlı bir ORM kütüphanesidir; bu, veritabanı ile etkileşiminiz birkaç kayıt almakla sınırlı olduğunda çok kullanışlıdır. Bir MySQL veritabanından tek tek kayıtları bir CSV dosyasına kopyalamanız gerekiyorsa, peewee en iyi seçimdir.
-
Django ORM, Django web çerçevesinin en güçlü parçalarından biridir ve çeşitli SQLite, PostgreSQL ve MySQL veritabanlarıyla kolayca etkileşim kurmanıza olanak tanır. Birçok Django tabanlı uygulama, veri modelleme ve temel sorgular için Django ORM'yi kullanır, ancak daha karmaşık görevler için geliştiriciler genellikle SQLAlchemy kullanır.
Sonuç
Bu eğitimde, bir MySQL veritabanını Python uygulamanıza nasıl entegre edebileceğinize bir göz attık. Ayrıca MySQL veritabanının bir test örneğini geliştirdik ve onunla doğrudan Python kodundan etkileşim kurduk. Python, MongoDB ve PostgreSQL gibi diğer DBMS'ler için bağlayıcılara sahiptir. Python ve veritabanlarıyla ilgili başka hangi materyallerle ilgileneceğinizi bilmekten memnuniyet duyarız.
Bu makalede gösterilen medya Analytics Vidhya'ya ait değildir ve Yazarın takdirine bağlı olarak kullanılır.
İlgili bağlantılar
- '
- "
- 100
- 11
- 2016
- 2019
- 7
- 9
- erişim
- Hesap
- Action
- aktif
- Ek
- Adventure
- Hava Kuvvetleri
- Türkiye
- Izin
- analiz
- analytics
- animasyon
- Uygulama
- uygulamaları
- argümanlar
- göre
- saldırılar
- İYİ
- Siyah
- kutu
- gişe
- çağrı
- hangi
- Yakalamak
- meydan okuma
- değişiklik
- çocuk
- kod
- Sütun
- Komedi
- ticari
- Yakın İletişim
- topluluk
- bileşen
- karışıklık
- Bağlantılar
- Çift
- Oluşturma
- Tanıtım
- Suç
- veri
- veri analizi
- veri yönetimi
- veritabanı
- veritabanları
- Tarih
- ölü
- ayrıntı
- geliştirmek
- geliştiriciler
- Django
- liman işçisi
- dolar
- Dram
- sürücü
- Damla
- çevre
- tahminleri
- vb
- infaz
- HIZLI
- Özellikler(Hazırlık aşamasında)
- Özellikler
- Fiyatlandırma(Yakında)
- Kurgu
- şekil
- Film
- filmler
- Nihayet
- Ad
- Airdrop Formu
- biçim
- iskelet
- işlev
- genel
- Tercih Etmenizin
- kapmak
- grup
- rehberlik
- Hacker
- hackerlar
- kullanma
- kullanışlı
- okuyun
- gizlemek
- Ana Sayfa
- Ne kadar
- Nasıl Yapılır
- HTTPS
- Dahil olmak üzere
- bilgi
- etkileşim
- izolasyon
- IT
- İş
- kaydol
- anahtar
- anahtarlar
- King
- bilgi
- dil
- Diller
- büyük
- öncülük etmek
- ÖĞRENİN
- Kütüphane
- Sınırlı
- LINK
- linux
- Liste
- macos
- büyük
- Yapımı
- yönetim
- hile
- pazar
- Pazar lideri
- malzemeler
- medya
- milyon
- MongoDB
- En popüler
- film
- filmler
- isimleri
- Netflix
- Teklifler
- resmi
- ofset
- açık
- açık kaynak kodu
- işletme
- işletim sistemi
- işletim sistemleri
- Operasyon
- kehanet
- sipariş
- Diğer
- paradigma
- Şifre
- İnsanlar
- performans
- Popüler
- Programı
- Programlama
- Programlama dilleri
- proje
- özellik
- Python
- menzil
- değerlendirme
- nedenleri
- kayıtlar
- İlişkiler
- Kaynaklar
- Sonuçlar
- İade
- yorum
- Yorumları
- Risk
- Rulo
- koşmak
- koşu
- Bilim
- güvenlik
- set
- ayar
- Basit
- küçük
- So
- Yazılım
- Solaris
- Çözümler
- uzay
- Spor
- SQL
- SQL Injection
- standartlar
- başlama
- başladı
- Açıklama
- hafızası
- başarı
- Gunes isigi
- tamamlamak
- destek
- sistem
- Sistemler
- Hedef
- teknoloji
- test
- zaman
- oyuncak
- işlem
- işlemler
- öğretici
- Güncelleme
- us
- kullanıcılar
- değer
- Görüntüle
- Sanal
- Savunmasız
- savaş
- ağ
- DSÖ
- pencereler
- içinde
- İş
- çalışır
- yıl