Python - Sqlite3 Salt Okunur Mu?

Merhaba,

Birden fazla kullanıcının bağlanıp sorgu, kayıt, veri çekme gibi farklı işler yapabileceği bir programda sqlite3 dosyasının maruz kalacağı bir sıkıntı olabilir mi?

Örneğin iki kullanıcı aynı anda sqlite3 dosyasına bağlanmayı denediğin de birinden birine bir hata verir mi? Aynı anda kayıt yapmaya çalıştıklarında birinin kaydını yaparken diğerinin kaydına ne olur?

Kısaca sorum şu;

  • sqlite3 dosyasına birden fazla bağlantı, sorgu, kayıt tarzı işlemler yapıldığı zaman karşılaşılacak sorunlar nelerdir?

Ya da alternatif olarak önereceğiniz farklı bir veritabanı modülümüz mevcut mu?

Not: Bahsettiğim şeyleri öğrenmek için deneme-yanılma yoluna başvuracak imkanlara sahip olmadığım bir alan ve zaman içerisindeyim. Bundan dolayı beyin fırtınası yaparsak başlangıç için iyi olacağını düşündüm.

Fikirleriniz için şimdiden teşekkür ederim.

SQLite veritabanı, kendi sitesinde yazdığına göre aynı anda sınırsız sayıda kullanıcının okumasına izin verirken, yazmak için o anda yalnızca bir kullanıcıya izin veriyor. Birisi veritabanına kayıt yaparken, bir başka kişi veritabanına kayıt yapmaya kalkarsa sqlite3.OperationalError: database is locked hatası alır. Ya da aynı şekilde aynı programda bir thread kayıt yaparken, diğer thread kayıt yapmaya kalkarsa aynı hatayı alır.

evet bu hata daha önce de karşılaştığım bir durumdu. Aslında kullanıcıların kayıt yapacağı an birbirleri ile denk gelme ihtimalleri çok düşük olacak. Yine de riske girmeye gerek yok. Ya da bunun için bir koşul durumu oluşturulabilir. Çözümlerim ilkel düzeyde.

Farklı bir veritabanı modülü var mı?

Birden fazla kullanıcı dosyaya nasıl bağlanıyor? Tek thread içinde birden fazla dosya nesnesi ile mi, birden fazla thread’da tek dosya nesnesi ile mi, farklı process veya uygulamalardan mı?

1 Beğeni

@EkremDincel
10 tane bilgisayarın olduğu bir ortamda hepsinin ortak bağlandığı bir depolama alanı mevcut. Bu depolama alanı her bilgisayar tarafından aynı konum bilgisine sahip.

10 tane bilgisayarda aynı kodlara sahip 10 tane aynı program mevcut. Bu programa girişler sabit değil. Herkes kendi kullanıcı isimleri ile giriş yapıyor. 10 program açılıyor ve çalışıyor.

Programlar açılıyor ve çalışıyor fakat her saniye veritabanına bağlı olarak çalışmıyor. Sadece sorgu yapacağı an bağlanıp çalışıyor ve bu da toplamda 2 saniye kadar sürüyor. Ardından hemen bağlantıyı kapatıyor. Böylelikle çok kısa sürede işini hallediyor ve veritabanından çıkış yapıyor.

Birden fazla uygulamanın bir dosyayı aynı anda açabiliyor olup olmaması işletim sistemine bağlı. Siz bir de birden fazla bilgisayarın ortak bir depolama donanımına bağlı olduğunu söylüyorsunuz. Öyleyse konu bu bağlantının nasıl yapıldığı ve nelere izin verdiği ile de alakalı, kütüphanenin veya dilin neyi desteklediğinden ibaret değil.

4 Beğeni

Aynen oyle. Mesela Windows’ta ayni dosyayi birden fazla program acamaz. Linux’te boyle degil.

1 Beğeni

Bahsettiğiniz sorunlarla uğraşmamak için zaten DBMS(veritabanı yönetim sistemleri) denilen sistemler geliştirilmiştir. O yüzden SQLite yerine client-server şeklinde kullanılabilen bir sistemle çalışın, mesela MySQL gibi.

1 Beğeni

Eğer, verilerin çakışması gibi bir durum yoksa, şöyle bir yapı işinize yarayabilir belki.

from time import sleep

def func(args):
  try:
    ...
    db.commit()

  except sqlite3.OperationalError:
    sleep(1)
    func(args)
1 Beğeni

Şuan deneme imkanı buldum ve birden fazla aynı program aynı sqlite3 dosyasını açıyor. Sorun yok görünüyor.

farklı bir öneri için teşekkür ederim.

1 Beğeni

doğru ama şuan açtı .db dosyasını :confused:

Güzel yöntem. Kullanılabilir. Teşekkür ederim.

1 Beğeni

Bu yöntem bana pek sağlıklı gelmedi. sqlite3.OperationalError hatasının yükselebileceği bir durum olarak aklıma sadece birden fazla thread’dan aynı bağlantının kullanılması geliyor, onda da lock veya queue gibi yapılar kullanılmalı.

Çözüm niteliğindeki önerilerinizi öğrenebilir miyim? Tavsiyeniz nelerdir? @EkremDincel

Anlattığınız duruma nasıl bir çözüm bulunabileceği hakkında bilgim yok. Ama birinin yardım edebilmesi için de bunları bilmesi gerekiyor:

Tek uygulamanın birden fazla thread ile veritabanına erişmesi konusunda yardım istiyorsanız birkaç örnek gösterebilirim.

ben bahsettiğim programın o aşamasını bir kurup deneyeceğim. İhtiyaçlarımı görebilecek bir seviyede olursa aynı şekilde devam ederim. Yok olmazsa çözüm için arayışlara tekrar başlarım. sqlite3 ve mysql’i deneyeceğim.

2 Beğeni

süper bilgi , teşekkür ederim. Aklımdan geçen her soruya cevap vermişler.