Compare commits

...

10 commits

Author SHA1 Message Date
C ve Sistem Programcıları Derneği
19cf9872de new version 2025-04-14 14:13:53 +03:00
C ve Sistem Programcıları Derneği
d3acef0c95 Update YapayZeka-MakineOgrenmesi-VeriBilimi-OzetNotlar-Ornekler.txt 2025-04-14 13:44:20 +03:00
C ve Sistem Programcıları Derneği
c1f1e217c2 New version 2025-04-09 13:39:23 +03:00
C ve Sistem Programcıları Derneği
071874ef4c Update C-OzetNotlar-Ornekler.txt 2025-04-08 14:27:31 +03:00
C ve Sistem Programcıları Derneği
209f19779e Update Python-App-OzetNotlar-Ornekler.txt 2025-04-08 13:07:41 +03:00
C ve Sistem Programcıları Derneği
001a4a8d27 Update YapayZeka-MakineOgrenmesi-VeriBilimi-OzetNotlar-Ornekler.txt 2025-04-08 12:45:55 +03:00
C ve Sistem Programcıları Derneği
73eca36213 Update YapayZeka-MakineOgrenmesi-VeriBilimi-OzetNotlar-Ornekler.txt 2025-03-31 16:24:10 +03:00
C ve Sistem Programcıları Derneği
55bbfa2247 Update C-OzetNotlar-Ornekler.txt 2025-03-31 15:43:53 +03:00
C ve Sistem Programcıları Derneği
3eb7f0e764 Update C-OzetNotlar-Ornekler.txt 2025-03-30 21:24:51 +03:00
C ve Sistem Programcıları Derneği
9727973d46 Update Unix-Linux-SysProg-OzetNotlar-Ornekler.txt 2025-03-30 14:20:27 +03:00
6 changed files with 8816 additions and 2065 deletions

BIN
.DS_Store vendored

Binary file not shown.

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -11,7 +11,7 @@
(Notları sabit genişlikli font kullanan programlama editörleri ile açınız.) (Notları sabit genişlikli font kullanan programlama editörleri ile açınız.)
(Editörünüzün "Line Wrapping" özelliğini pasif hale getiriniz.) (Editörünüzün "Line Wrapping" özelliğini pasif hale getiriniz.)
Son Güncelleme: 27/10/2023 - Cuma Son Güncelleme: 08/04/2023 - Salı
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------
1. Ders 23/02/2025 - Pazar 1. Ders 23/02/2025 - Pazar
@ -2599,24 +2599,35 @@ s
Cursor nesnesi bir kez dolaşıldıktan sonra yeniden dolaşılamaz. Çünkü artık dolaşımın sonuna gelinmiştir. Cursor nesnesi ile Cursor nesnesi bir kez dolaşıldıktan sonra yeniden dolaşılamaz. Çünkü artık dolaşımın sonuna gelinmiştir. Cursor nesnesi ile
dolaşmak yerine fetchone, fatchmany ya da fetchall metotlarını kullanmak çoğu kez daha uygun olur. dolaşmak yerine fetchone, fatchmany ya da fetchall metotlarını kullanmak çoğu kez daha uygun olur.
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------
<BURADA KALDIK>
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------
Programcı birden fazla Cursor nesnesi ile çalışabilir. Connection sınıfının cursor metodu her çağrıldığında yeni bir Cursor nesnesi elde 10. Ders 06/04/2025 - Pazar
edilmektedir. Aslında execute metodu (executemany ve executescript metotları da) Cursor nesnesinin kendisine geri dönmektedir. Aşağıdaki gibi bir döngü #------------------------------------------------------------------------------------------------------------------------------------
geçerlidir:
#------------------------------------------------------------------------------------------------------------------------------------
Bir Cursor nesnesi kullanıldıktan sonra Cursor sınıfının close metodu ile onun tuttuğu kaynaklar boşaltılıp kapatılabilir. Ancak
ıkça kapatma yapılmadığı durumda Cursor nesnesi çöp durumuna geldiğinde sınıfın __del__ metodu yoluyla zaten nesnenin kaynakları
boşaltılıp kapatma işlemi yapılmaktadır. Dolayısıyla çoğu durumda Cursor nesnesinin kapatılmaması bir soruna yol açmamaktadır. Cursor
nesneleri "bağlam yönetim protokolüne (resource management protocol)" uymamaktadır. Dolayısıyla Cursor nesnelerini with deyimi ile
kullanamayız.
Programcı birden fazla Cursor nesnesi ile çalışabilir. Connection sınıfının cursor metodu her çağrıldığında yeni bir Cursor nesnesi
elde edilmektedir. Aslında execute metodu (executemany ve executescript metotları da) Cursor nesnesinin kendisine geri dönmektedir.
Aşağıdaki gibi bir döngü geçerlidir:
for name, no, school_id in conn.cursor().execute("SELECT * FROM student"): for name, no, school_id in conn.cursor().execute("SELECT * FROM student"):
print(name, no, school_id) print(name, no, school_id)
Burada conn.cursor() çağrısı bize bir Cursor nesnesi verir. Sonra o nesne ile execute metodunu çağırdığımızda Cursor nesnesinin yine Burada conn.cursor() çağrısı bize bir Cursor nesnesi verir. Sonra o nesne ile execute metodunu çağırdığımızda Cursor nesnesinin
kendisini elde ederiz. İşte biz de yukarıdaki örnekte bu Cursor nesnesini dolaşmış olmaktayız. Pekiyi yaratılan Cursor nesneleri birtakım bilgiler yine kendisini elde ederiz. İşte biz de yukarıdaki örnekte bu Cursor nesnesini dolaşmış olmaktayız.
tuttuğuna göre bunların yok edilmesi nasıl olmaktadır? Cursor nesneleri de aslında close edilebilmektedir. Ancak programcılar bu işlemi
genellikle yapmazlar. Çöp toplayıcı zaten __del__ metodunda close işlemini yapmaktadır.
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------
INSERT, UPDATE, DELETE işlemleri sonucunda bu işlemden etkilenen kayıt sayısı Cursor sınıfının rowcount isimli örnek özniteliğinden INSERT, UPDATE, DELETE işlemleri sonucunda bu işlemlerden etkilenen kayıt sayısı Cursor sınıfının rowcount isimli örnek özniteliğinden
elde edilebilmektedir. Örneğin biz DELETE komutu ile bir grup kaydı silmişsek rowcount bize silinen kayıtların sayısını verir. elde edilebilmektedir. Örneğin biz DELETE komutu ile bir grup kaydı silmişsek rowcount bize silinen kayıtların sayısını verir.
rowcount örnek özniteliği SELECT komutu uygulandığında set edilmemektedir. Yani biz SEELCT edilen satırların sayısını rowcount ile
elde edemeyiz.
Aşağıdaki örnekte biz veritabanına 1 kayıt insert ediyoruz. Dolayısıyla rowcount bize 1 değerini verecektir. Aşağıdaki örnekte biz veritabanına 1 kayıt insert ediyoruz. Dolayısıyla rowcount bize 1 değerini verecektir.
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------
@ -2628,62 +2639,107 @@ try:
cur.execute("INSERT INTO student(student_no, student_name, school_id) VALUES(2145, 'Fehmi Özışık', 2)") cur.execute("INSERT INTO student(student_no, student_name, school_id) VALUES(2145, 'Fehmi Özışık', 2)")
print(cur.rowcount) # 1 print(cur.rowcount) # 1
conn.commit() conn.commit()
except sqlite3.Error as e: except sqlite3.Error as e:
print(e) print(e)
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------
Cursor sınıfının connection isimli örnek özniteliği bize o Cursor nesnesinin yaratıldığı connection nesnesini vermektedir. Bu sayede Cursor sınıfının connection isimli örnek özniteliği bize o Cursor nesnesinin yaratıldığı connection nesnesini vermektedir. Bu
eğer elimizde bir Cursor nesnesi varsa biz connection nesnesini de elde edebiliriz. sayede eğer elimizde bir Cursor nesnesi varsa biz connection nesnesini de elde edebiliriz. Böylece bizim bir fonksiyona hem Cursor
nesnesini hem de Connection nesnesini paramete olarak geçirmemize gerek kalmaz. Zaten Cursor nesnesinden hareketle Connection
nesnesini elde edebiliriz.
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------
import sqlite3
def insert_record(cur, student_no, student_name, school_id):
sqlcmd = f"INSERT INTO student(student_no, student_name, school_id) VALUES({student_no}, '{student_name}', {school_id})"
cur.execute(sqlcmd)
cur.connection.commit()
try:
with sqlite3.connect('school.sqlite') as conn:
cur = conn.cursor()
student_no = int(input('No:'))
student_name = input('Adı Soyadı:')
school_id = int(input('School Id:'))
insert_record(cur, student_no, student_name, school_id)
except sqlite3.Error as e:
print(e)
except Exception as e:
print(e)
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------
Birden fazla tablo ile ilgili INSERT işlemleri yapılırken dikkatli olmak gerekir. Örneğin "student" tablosunun bir sütunu "school_id" Birden fazla tablo ile ilgili INSERT işlemleri yapılırken dikkatli olmak gerekir. Örneğin "student" tablosunun bir sütunu "school_id"
biçiminde olsun. Bu sütunun da "school" tablosunun bilgilerine erişmek için "foreign key" olarak kullanıldığını düşünelim. Biz şimdi biçiminde olsun. Bu sütunun da "school" tablosunun bilgilerine erişmek için "foreign key" olarak kullanıldığını düşünelim. Biz şimdi
bir öğrenci INSERT ederken school tablosunda olmayan bir school_id girmemeliyiz. Bu tür kontoller şüphsiz manuel biçimde school tablosu bir öğrenciyi INSERT ederken school tablosunda olmayan bir school_id girmemeliyiz. Bu tür kontoller şüphesiz manuel biçimde school
sorgulanarak yapılabilir. Ancak VTYS'ler bu tür işlemleri kendi içlerinde yapabilmektedir. Bunlara "yabancı anahtar kısıtları (foreign key constraints)" tablosu sorgulanarak yapılabilir. Ancak VTYS'ler bu tür işlemleri kendi içlerinde yapabilmektedir. Bunlara "yabancı anahtar kısıtları
denilmektedir. Yabancı anahtar kısıtları tablo yaratılırken CREATE TABLE komutunda komutun sonunda belirtilmektedir. VYS'ler arasında bu konuda (foreign key constraints)" denilmektedir. Yabancı anahtar kısıtları tablo yaratılırken CREATE TABLE komutunda komutun sonunda belirtilmektedir.
farklılıklar bulunmaktadır.Örneğin SQLite'ta CREATE TABLE komutunda komutun sonunda aşağıaki gibi kısıt girilebilir: VTYS'ler arasında bu konuda farklılıklar bulunmaktadır. Örneğin SQLite'ta CREATE TABLE komutunda komutunun sonunda aşağıaki gibi kısıt
girilebilir:
CREATE TABLE student ( CREATE TABLE student (
..... .....
FOREIGN KEY (school_id) REFERENCES school(school_id) FOREIGN KEY (school_id) REFERENCES school(school_id)
) )
Burada student tablosunaki school_id sütunu scool tablosundaki school_id ütunu ile foreign key temelinde ilişkilendirilmiştir.
Artık biz bir örenciyi eklerken school tablosunda olmayan bir scool_id girersek işlme başarısızlıkla sonuçlanacaktır.
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------
Bazı tablolarda bazı sütunlar "yabancı anahtar (foreign key)" durumundadır. Öğrenğin school tablosunun school_id elemanı hem PRIMARY KEY Bazı tablolarda bazı sütunlar "yabancı anahtar (foreign key)" durumundadır. Öğrenğin school tablosunun school_id elemanı hem PRIMARY KEY
durumundadır hem de student tablosu için FOREIGN KEY durumundadır. school tablosuna bir okul eklerken ekleyen kişinin school_id vermesi durumundadır hem de student tablosu için FOREIGN KEY durumundadır. school tablosuna bir okul eklerken ekleyen kişinin school_id vermesi
zor bir kullanımdır. İşte bu tür durumlarda ilgili sütuna AUTOINCREMENT özelliği verilebilmektedir. AUTO INCREMENT bir sütun söz konusu olduğunda zor bir kullanımdır. İşte bu tür durumlarda anımsanacağı gibi ilgili sütuna AUTOINCREMENT özelliği verilebilmektedir. AUTO INCREMENT
eğer INSERT işleminde bu sütun belirtilmezse bu durumda VTYS genellikle en büyük numaranın bir fazlasını almaktadır. SQLite'ta aslında PRIMARY KEY bir sütun söz konusu olduğunda eğer INSERT işleminde bu sütun belirtilmezse bu durumda VTYS en büyük numaranın bir fazlasını almaktadır.
olan tamsayı alanları otomatik AUTOINCREMENT durumdadır. Ancak uygulamacı AUTOINCREMENT belirlemesini yine yapabilir. SQLite'ta aslında PRIMARY KEY olan tamsayı alanları otomatik AUTOINCREMENT durumdadır. Ancak uygulamacı AUTOINCREMENT belirlemesini
yine yapabilir.
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------
Cursor sınıfının commit metodu veritabaı üzerinde yapılan değişikliklerin atomik bir biçimde veritabanına yansıtılmasını sağlamaktadır. Bazen veritabanı üzerinde birbirleriyle ilişkili olan işlemler yapılıyor olabilir. Bu tür işlemlerin "ya hep ya hiç" biçiminde
Bir kaydın veritabanına insert edilmesi sırasında aslında bu kayıt insert etme işlemi birden fazla tabloya INSERT INTO komutlarıyla gereçekleştirilmesi gerelebilmektedir. İşte VTYS'lerde "bir grup eylemin sanki tek bir eylemmiş gibi peşi sıra gerçekleştirilmesine
yapılabilmektedir. Örneğin: "transaction" denilmektedir. Örneğin bir grup bilginin birbirleriyle tutarlı bir biçimde üç farklı tabloya insert edilmek istendiğini
düşünelim. Biz bu üç insert işlemi başarılıysa en sonunda commit yaparak bu işlemlerin veritabanına yansıtılmasını isteriz. Örneğin:
INSERT INTO ... INSERT INTO ...
INSERT INTO ... INSERT INTO ...
INSERT INTO ... INSERT INTO ...
COMMIT COMMIT
Pekiyi bu işlemlerin herhangi birinde bir sorun olsa ne olacaktır? Genel olarak bu tür sorunlarda exception oluşaacağı için akış commit Pekiyi bu işlemlerin herhangi birinde bir sorun çıkarsa ne olacaktır? Genel olarak bu tür sorunlarda exception oluşacağı için akış
metodunu görmeyecektir. Dolayısıyla değişikliklerin hiçbiri veritabanına yansıtılmayacaktır. Peki exception'a yol açan önceki INSERT INTO işlemleri commit işlemini görmeyecektir. Dolayısıyla değişikliklerin hiçbiri veritabanına yansıtılmayacaktır. Ancak exception'a yol açmayan
ne olacaktır? İşte o işlemler ilk commit işleminde yapılacağı için onların "geri alınması" gerekmektedir. Bu geri alma işlemi Cursor sınıfının rollback önceki INSERT INTO işlemleri eğer geri alınmazsa ilk commit işleminde veritabanına yansıtılır ki bunun sonucunda ilgili bilgi
isimli metoduyla yapılmaktadır. Eğer rollback metodu çağrıldığında hiçbir transaction içerisinde bulunulmuyorsa metodun bir etkisi olmaz. tutarsız bir biçimde tablolara eklenmiş olur. İşte peşi sıra gerçekleştirilen bir grup işlemde bir işlem başarısız olduğunda önceki
başarılı olan işlemlerin de geri alınmasına "rollback" denilmektedir. Rollback işlemi Connection sınıfının rollback isimli metoduyla
yapılmaktadır. rollback metodunun self parametresinin dışında parametresi yoktur. Eğer rollback metodu çağrıldığında hiçbir transaction
içerisinde bulunulmuyorsa metodun bir etkisi olmaz.
VTYS'lerde yukarıdaki gibi bir grup komutun sanki tek komutmuş gibi "atomik" bir biçimde işletilmesine "transaction" denilmektedir. Yukarıda da belirttiğimiz gibi VTYS'lerde bir grup komutun sanki tek komutmuş gibi "atomik" olarak işletilmesine "transaction"
Eskiden VTYS'ler transcation işlemlerini desteklemiyordu. Sonra VTYS'ler bu özelliklere sahip oldular. Bugün SQLite da dahil olmak üzere denilmektedir. Eskiden VTYS'ler transcation işlemlerini desteklemiyordu. Sonra VTYS'ler bu özelliklere sahip oldular. Bugün SQLite da
VTYS'ler "transaction" işlemlerini desteklemektedir. Pek çok VTYS'de transaction işlemleri SQL ile de desteklenmektedir. Tipik olarak transaction dahil olmak üzere VTYS'lerin hemen hepsi "transaction" işlemlerini desteklemektedir. Pek çok VTYS'de transaction işlemleri SQL ile
BEGIN gibi bir SQL komutuyla başlatılır. Eğer bir sorun oluşmazsa COMMIT işlemi sorun oluşursa ROLLBACK işlemi yapılır. de desteklenmektedir. Tipik olarak transaction BEGIN ya da BEGIN TRANSACTION gibi bir SQL komutuyla başlatılır. Eğer bir sorun oluşmazsa
COMMIT işlemi sorun oluşursa ROLLBACK işlemi yapılır. Örneğin:
Python'da biz genel olarak transaction'ları SQL komutlarıyla değil metotlarla oluşutururuz. Cursor sınıfının "execute" ve "executemany" BEGIN TRANSACTION;
"executescript" isimli metotları eğer bir transaction başlatılmamışsa otomatik olarak transaction'ı başlatılırlar. Yani bizim transaction'ı BEGIN TRY
başlatmak için Python programcısı olarak SQL komutu kullanmamıza ya da özel bir işlem yapmamıza gerek yoktur. Bu durumda tipik bir transaction INSERT INTO tablo_adı (kolon1, kolon2) VALUES (değer1, değer2);
şöyle yürütülmelidir: INSERT INTO tablo_adı (kolon1, kolon2) VALUES (değer3, değer4);
INSERT INTO tablo_adı (kolon1, kolon2) VALUES (değer5, değer6);
COMMIT;
END TRY
BEGIN CATCH
ROLLBACK;
END CATCH;
SQL'deki transaction komutları VTYS'den VTYS'ye farklılıklar gösterebilmektedir.
Python'da biz çoğu kez transaction'ları SQL komutlarıyla değil metotlarla oluşutururuz. Cursor sınıfının "execute" ve "executemany"
isimli metotları eğer bir transaction başlatılmamışsa otomatik olarak transaction'ı başlatılırlar. Yani bizim transaction'ı başlatmak
için Python programcısı olarak SQL komutu kullanmamıza ya da özel bir işlem yapmamıza gerek yoktur. Bu durumda tipik bir transaction
Python'da şöyle yürütülmelidir:
try: try:
cur.execute(...) cur.execute(...)
@ -2691,15 +2747,14 @@ except sqlite3.Error as e:
cur.execute(...) cur.execute(...)
cur.commit() cur.commit()
except sqlite3.Error as e: except sqlite3.Error as e:
cur.rollback() conn.rollback()
Özel bir durum olarak execute işleminde eğer SQL SELECT komutu uygulanmışsa bu durumda transcation otomatik başlatılmamaktadır.
Transaction kavramı ve rollback işlemi birden fazla INSERT, UPDATE ve DELETE komutlarının peşi sıra geldiği durumlarda önemli olmaktadır. Transaction kavramı ve rollback işlemi birden fazla INSERT, UPDATE ve DELETE komutlarının peşi sıra geldiği durumlarda önemli olmaktadır.
Yoksa tek bir INSERT, UPDATE ya da DELETE komutu için rollback yapmaya gerek yoktur. Rollback işlemi bir grup peşi sıra yapılan işlemin bir tanesi Yoksa tek bir INSERT, UPDATE ya da DELETE komutu için rollback uygulamaya gerek yoktur. Yukarıda da beirttiğimiz gibi rollback işlemi
başarısız ise onların hiçbirini yapmamayı sağlamaktadır. commit işlemi ise onların hepsini tek bir işlemmiş gibi atomik yapmayı sağlar. bir grup peşi sıra yapılan işlemin bir tanesi başarısız ise onların hiçbirini yapmamayı sağlamaktadır. commit işlemi ise onların
#------------------------------------------------------------------------------------------------------------------------------------ hepsini tek bir işlemmiş gibi atomik yapmayı sağlar.
#------------------------------------------------------------------------------------------------------------------------------------
10. Ders 11/01/2023 - Çarşamba
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------
@ -2712,23 +2767,73 @@ except sqlite3.Error as e:
CREATE TABLE student(student_no INTEGER, student_name VARCHAR(64), school_id INTEGER, CREATE TABLE student(student_no INTEGER, student_name VARCHAR(64), school_id INTEGER,
FOREIGN KEY("school_id") REFERENCES "school"("school_id"), PRIMARY KEY("student_no" AUTOINCREMENT)); FOREIGN KEY("school_id") REFERENCES "school"("school_id"), PRIMARY KEY("student_no" AUTOINCREMENT));
""") """)
Biz executescript metodu otomatik transaction başlatmamaktadır. Eğer bu metot ile transcation yapılacaksa SQL komutunun içerisine
transaction'ı başlatan BEGIN (ya da BEGIN TRANSACTION) komutu eklenmelidr. Örneğin:
cur.executescript("""
BEGIN;
CREATE TABLE person(firstname, lastname, age);
CREATE TABLE book(title, author, published);
CREATE TABLE publisher(name, address);
COMMIT;
""")
Burada biz üç farklı tablo yaratmak istedik. Eğer bu üç tablonun hepsi yaratılırsa SQL içerisinde commit işlemi yapılmıştır.
Eğer burada bu komutlardan herhangi birinde bir sorun oluşursa bu durumda exception fırlatılır biz de bu exception içerisinde
rollback yapabiliriz. Örneğin:
try:
cur.executescript("""
BEGIN;
CREATE TABLE person(firstname, lastname, age);
CREATE TABLE book(title, author, published);
CREATE TABLE publisher(name, address);
COMMIT;
""")
except sqlite3.Error as e:
conn.rollback()
Tabii yukarıda da belirttiğimiz gibi execute, executemany ve exceutescript metotları zaten otomatik trnsaction oluşturmaktadır.
Python programcıları da genellikle commit ve rollback gibi işlemleri SQL komutlarının içerisinde değil metot çağrılarıyla
yapmaktadır.
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------
import sqlite3
try:
with sqlite3.connect('test.sqlite') as conn:
cur = conn.cursor()
cur.executescript("""
CREATE TABLE person(person_id INTEGER PRIMARYKEY AUTO_INCREMENT person_name VARCHAR(20), person_no INTEGER);
CREATE TABLE book(book_id INTEGER PRIMARYKEY AUTO_INCREMENT book_title VARCHAR(128), book_author VARCHAR(128));
CREATE TABLE WRONG_COMMAND publisher(name, address);
""")
except sqlite3.Error as e:
conn.rollback()
print(e)
except Exception as e:
print(e)
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------
Bir uygulamada eğer veritabanı zaten yoksa onu yaratan kodlar da uygulamanın içerisinde bulunabilir. Yukarıda da belirttiğimiz gibi Bir uygulamada eğer veritabanı zaten yoksa onu yaratan kodlar da uygulamanın içerisinde bulundurulabilir. Yukarıda da belirttiğimiz
connect isimli fonksiyon SQLite'ta eğer veribanı dosyası varsa olanı açmakta yoksa içi boş olarak sıfırdan yaratmaktadır. Veritabanı gibi connect isimli fonksiyon SQLite'ta eğer veribanı dosyası varsa olanı açmakta yoksa içi boş olarak sıfırdan yaratmaktadır. Veritabanı
tabloları yaratılırken eğer tablo zaten varsa exception oluşur. Ancak CREATE TABLE komutuna IF NOT EXISTS cümleceği eklenirse eğer tablo tabloları yaratılırken eğer tablo zaten varsa exception oluşur. Ancak CREATE TABLE komutuna IF NOT EXISTS cümleceği eklenirse eğer
varsa komut etki göstermez ancak tablo yoksa yaratılır. Örneğin: tablo varsa komut etki göstermez ancak tablo yoksa yaratılır. Örneğin:
def create_tables(cur): def create_tables(cur):
cur.executescript(""" cur.executescript("""
CREATE TABLE IF NOT EXISTS school (school_id INTEGER PRIMARY KEY AUTOINCREMENT, school_name TEXT(64), school_type TEXT(64)); CREATE TABLE IF NOT EXISTS school (school_id INTEGER PRIMARY KEY AUTOINCREMENT, school_name TEXT(64), school_type TEXT(64));
CREATE TABLE IF NOT EXISTS student(student_no INTEGER, student_name VARCHAR(64), school_id INTEGER, FOREIGN KEY("school_id") REFERENCES "school"("school_id"), PRIMARY KEY("student_no" AUTOINCREMENT)); CREATE TABLE IF NOT EXISTS student(student_no INTEGER, student_name VARCHAR(64), school_id INTEGER,
FOREIGN KEY("school_id") REFERENCES "school"("school_id"), PRIMARY KEY("student_no" AUTOINCREMENT));
""") """)
Burada create_tables fonksiyonu veritabanı tablolarını yaratmaktadır. Ancak tablolar zaten yaratılmışsa buradaki komutların bir etkisi olmayacaktır. Burada create_tables fonksiyonu veritabanı tablolarını yaratmaktadır. Ancak tablolar zaten yaratılmışsa buradaki komutların bir
etkisi olmayacaktır.
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------
BURADA KALDIK
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------
Aşağıda "school" veritabanı üzerinde temel işleler yapan konsol tabanlı basit bir program verilmiştir. Aşağıda "school" veritabanı üzerinde temel işleler yapan konsol tabanlı basit bir program verilmiştir.
#------------------------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------------------------

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff