Sqlite3 veri güncelleme

Merhaba Arkadaşlar,
Kütüphane otomasyonu yapıyorum. Bir yerde takıldım. Aslında başka bir şekilde hallettim yapmak istediğimi. Sadece bilmek istiyorum bunun bir yöntemi var mı? Sorum şu:
Kütüphanedeki kitapları veritabanında tutuyorum ve her kitap kimler tarafından okunmuşsa okuyan kişileri veritabanında kitabın kaydının bulunduğu satırda “kimler_okudu” hücresinde tutmak istiyorum.

imlec.execute("""UPDATE kitaplar SET kimler_okudu=?,  WHERE uye_no=?", (okuyan, uye_no,))

Bu şekilde yapınca hücredeki kayıt tamamen siliniyor. Benim istediğim o hücredeki verinin üzerine yazılsın. Sqlite datebase’de bunu yapacak bir fonksiyon var mı?

Merhaba;

Amacınız ‘eklemek’ ise neden ‘güncelliyorsunuz’?. UPDATE deyimi var olan data’yı ‘günceller/değiştirir’. Yani aslında yapması gerekeni yapıyor. Data eklemek için INSERT INTO deyimini kullanmalısınız.

var olan satırdaki var olan sütundaki değeri güncellemek istiyor. Yeni bir satır değil var olan değere eklemek yapmak istiyor arkadaş.

okuyanlar = @tevhidulvahset @Ali_Kemal_Keles @ggns7 gibi düşün.

1 Beğeni

galiba arkadas many to one iliskisinden bahsediyor

yapacağın işlemler şu şekilde olsun;

  • önce güncellemek istediğin db’deki kayıtlı veriyi çek
  • çektiğin verideki değerleri bir liste içerisine al
  • bu çektiğin verilere eklenecek yeni veriyi az önceki listeye ekle
  • listenin son halini update ile güncelle db’deki ilgili yere güncelle

db’deki verilerin kayıt tarihlerini kontrol ediyor musun? kayıt edilme, değiştirilme, güncellenme

guzel dusunmussunuz.ama many to one iliskisiyle daha kolay hall edile bilir.ben sqlite3-de tam olarak nasil oluyor bilmiyorum.bilen varsa yardimci ola bilir.

bu nerede geçiyor reis?

kusura bakma many to many diyecegime many to one demisim.yani many to many olacak o.
ornegin suraya baka bilirsin:https://www.sqlite.org/lang_createtable.html
many to many su anlama geliyor: bir kitabin birden fazla okuyani ola bilir.ayni zamanda bir okuyanda birden fazla kitap okuya bilir.bu ilski ile iliskilendirilmis satirlara yeni bir sey eklendiginde eskisi silinmiyor,uzerine ekleniyor.eger yanlisim varsa duzeltin lutfen

o güzel tamam bu iyiymiş iş görür işte.

Bunu array veya liste olarak tutuyorsun sanirim. (Database sorularinda tablonun/tablolarin yapisini (.schema komutu) verirsen cevaplamak daha kolay olur. Tablodan/tablolardan ornek data da fena olmaz.)

Bu durumda array’e bir eleman eklemek icin tamamini okuyup eleman eklenmis halini yazmak gerekir. Kimi database motorlarinda bunu yapmak icin bir fonksiyon olabilir fakat bildigim kadariyla SQL’de/SQLite’ta yok.

Bu arada normalizasyon konusunda yapilacak ilk is, database’i 1NF’ye sokmak, bu array’leri yardimci tablolara aktarmayla oluyor. Aktardiktan sonra kitap okuyan (yani array elemani) eklemek/cikartmak bu yeni tabloya bir INSERT/DELETE ile oluyor.

Yapiyi normalize bir halde tutup optimize bir sekilde sorgulama geregi yoksa SQL yerine veri yapilarini oldugu gibi okuyup yazan JSON veya pickle gibi formatlari/mekanizmalari tavsiye ederim.

@aib hocam peki ben dedigim bu yol arkadasin sorununun cozumu icin dogru bir yolmu?

Bu iliski (many-to-many) verinin yapisini veya iliskisini tanimliyor, database’de nasil saklandigini degil.

OP’nin kullandigi(ni varsaydigimiz) kitap basina kimler_okudu array’i de bir many-to-many iliski sakliyor, tavsiye ettigimiz alternatifler de.

1 Beğeni

Ben de o şekilde yaptım. Veriyi çektim ve yeni veriyi listede toplayıp satıra güncelledim. Bunun kolay bir yol var mıdır diye düşünmüştüm.
Görüşleriniz için çok teşekkürler. Sanırım bahsettiğim durum için kısa bir fonksiyon yok

1 Beğeni

kimler_okudu=kimler_okudu+?
Şeklinde yapabilirsin, aralarına virgül koymayı da unutmadan tabi .
Edit: bu sayısal kısımda işler, sözel veri için sql sözel birleşme concat() fonksiyonu ile.
kimler_okudu=concat(kimler_okudu,?)

1 Beğeni