Sqlite database locked

Merhaba. Aşağıdaki kodlarda “OperationalError: database is locked” hatası alıyorum. Python 3.7.3 ve sqlite 3.27.2 kullanıyorum.

a = input("baba: ") 
b = input("sembol: ") 
im.execute("select bilge from ana where sembol = ? and deger = 'evet'",(b,))
cevap = im.fetchone()

if cevap != None:
    print("bilge: ", cevap)
    im.execute("insert into ana (bilge, sembol) values (?,?)",(cevap, b)) # burada hata vermiyor
   
else:
    im.execute("insert into ana (baba, sembol) values (?,?)",(a, b)) # hata bu satırı gösteriyor
    print("bilge: ", a)
    im.execute("insert into ana (bilge, sembol) values (?,?)",(a, b))


“.format(…)” yöntemini de denedim, başka sorgular da yaptım. “insert” ve “update” kullandığımda hep aynı hatayı veriyor. Değişken kullanmayıp gerçek değerler verdiğimde de aynı hatayı alıyorum. “insert” ve “update” işlemlerinde neyi yanlış yaptığımı anlayamadım. Yardım lütfen!

Merhaba. Tüm kodları paylaşabilir misiniz?

import sqlite3
#import time

vt = sqlite3.connect('C:\\Users\\Pc\\AppData\\Local\\Programs\\Python\\deneme12.db')
im = vt.cursor()

CREATE TABLE "ana" (
	"zaman"	INTEGER,
	"baba"	TEXT,
	"bilge"	TEXT,
	"deger"	TEXT,
	"sembol"	TEXT
)

a = input("baba: ") 
b = input("sembol: ") 
im.execute("select bilge from ana where sembol = ? and deger = 'evet'",(b,))
cevap = im.fetchone()

if cevap != None:
    print("bilge: ", cevap)
    im.execute("insert into ana (bilge, sembol) values (?,?)",(cevap, b))
    
else:
    im.execute("insert into ana (baba, sembol) values (?,?)",(a, b))
    print("bilge: ", a)
    im.execute("insert into ana (bilge, sembol) values (?,?)",(a, b))

a = input("baba: ") 
dizi= a.split()

if "hayır" in dizi:
    z="hayır"
if "evet," in dizi:
    z="evet"
    
im.execute("insert into ana (baba, sembol, deger) values (?,?,?)",(a, b, z))
im.execute("update ana set deger {} where bilge {}".format(z,a))


vt.commit()
vt.close()

Kodlarda biraz değişiklik yaptım, aşağıdaki kodları bir çalıştırır mısınız?

#!/usr/bin/env python3
# -*- coding: utf-8 -*-


import sqlite3
#import time

vt = sqlite3.connect("deneme12.db")
im = vt.cursor()

im.execute(
    "CREATE TABLE IF NOT EXISTS ana (zaman INTEGER, baba TEXT, bilge TEXT, deger TEXT, sembol TEXT)"
)

a = input("baba: ") 
b = input("sembol: ") 
im.execute("select bilge from ana where sembol = ? and deger = 'evet'",(b,))
cevap = im.fetchone()

if cevap != None:
    print("bilge: ", cevap)
    im.execute("insert into ana (bilge, sembol) values (?,?)",(cevap, b))
    
else:
    im.execute("insert into ana (baba, sembol) values (?,?)",(a, b))
    print("bilge: ", a)
    im.execute("insert into ana (bilge, sembol) values (?,?)",(a, b))

a = input("baba: ") 
dizi= a.split()

z = ""

if "hayır" in dizi:
    z = "hayır"
if "evet," in dizi:
    z = "evet"
    

im.execute("insert into ana (baba, sembol, deger) values (?,?,?)",(a, b, z))
im.execute("update ana set deger = ? where bilge = ?", (z, a))


vt.commit()
vt.close()

Teşekkür ederim, ama:

OperationalError: database is locked

Bir tane dosya oluşmuş olması lazım isminde locked geçen, onu bir silin, baştan deneyin isterseniz.

İsminde locked geçen bir dosya yok, olması gerektiği gibi farklı bir dizinde aynı isimli bir db. ve tablo oluşturdu. :roll_eyes: Ancak o tabloya if-else bloğunu geçti, son iki işlemi (insert ve update) yapmadı. Hiçbir işlem için hata mesajı da vermedi. Bu db. yi silerek eski dosyaya yönlendirdim, db. aynı satırda kilitlendi.

a1 = input("baba: ") 
dizi= a1.split()

z = ""

if "hayır" in dizi:
    z = "hayır"
if "evet," in dizi:
    z = "evet"
    

im.execute("insert into ana (baba, sembol, deger) values (?,?,?)",(a1, b, z))
im.execute("update ana set deger = ? where bilge = ?", (z, a))

Bu blokta “a” değişkenini “a1” olarak değiştirdim, yeni tabloda sorun kalmadı teşekkür ederim. Bu durumda, benim mevcut veritabanım sorunlu ve onu silmem mi gerekiyor sizce?

Yoo sorunlu bir veritabanı değil. Belki yanlış hatırlıyorum, emin değilim ama içinde locked geçen bir dosya da oluşuyordu ve onu silmek sorunu çözüyordu diye hatırlıyorum.

taradım ama içinde “locked” geçen bir dosya bulamadım. Bu konuda yardımcı olursanız sevinirim, zaman zaman karşılaştığım bir sorun ve uzun süre uğraştırıyor, bütün enerjimi bitiriyor. Tekrar teşekkürler.

Python’u cagiran arayuz / kullanilan IDE ile alakali olabilir. Arkada Python process’leri calisiyor mu? Oldurunce duzeliyor mu? (^C ile oldurmenin vt'yi kapatmamasi da sorun olabilir)

Her halukarda en dogrusu RAII kullanmak. (Python’da with statement’i seklinde var. Context manager mi ne oyle sacma sapan bir sey diyorlar.)

Yoksa workaround’u da vt = ...; try: vt.kullan(); finally: vt.close() seklinde.

İlginize teşekkürler. Ben programlamada yeniyim. IDE olarak Jupyter kullanıyorum. Bağlantı süresince python kodları da çalışıyor olmalı, kastınız bu ise. Oldurme nedir bilmiyorum. RAII’yı da. try: vt.kullan(); derken vt.commit() i mi kastediyorsunuz, deneyeceğim şimdi. Evet, denedim ve sonuç değişmedi. “darabase is locked”

Normalde bu noktada @dildeolupbiten kod ornegiyle, dedigimin tercumesiyle girerdi :slight_smile:

Soyle diyorum:

vt = sqlite3.connect("deneme12.db")
im = vt.cursor()
vt.close()

yerine:

with sqlite3.connect("deneme12.db") as vt:
    im = vt.cursor()

Ayni sekilde:

im = vt.cursor()
im.execute("select bilge from ana")
im.close()

yerine:

with vt.cursor() as im:
    im.execute("select bilge from ana")

Bunlar yoksa alternatif:

im = vt.cursor()
try:
    im.execute("select bilge from ana")
finally:
    im.close()

Yetişemedim @aib kardeşim. :slight_smile:

@aib’in dediğine katılıyorum. Yani locked sorunu OS ile alakalı bir sorun. Bu muhtemelen bitmemiş bir işlemin olduğu anlamına geliyor. @aib’in önerdiği gibi with ifadesi ile işlemlerinizi yapmayı deneyin. Veya try: ... finally: ... kullanarak, finally: kısmında veritabanını kapatın.

Belki bir işlem veritabanının kapatılmasını engelliyordur. Arka planda çalışan bir işlem olabilir. Bir bakın isterseniz.

Teşekkür ederim, önerilerinizi deneyeceğim.

Jupyter’de birden fazla kod sayfası açınca (çalışmalarım fonksiyonlar halinde ayrı ayrı sayfalarda) her biri arka planda veritabanı bağlantısı ile birşeyler yapmaya devam ediyor sanırım. En azından periyodik olarak oto-saving yapıyorlar. Üzerinde çalışmadığım sayfaları “interrupt” edince sorun çözüldü. “dildeolupbiten” ve “@aib” ye teşekkürler.

1 Beğeni

benzer hatayı ben de yaşadım. benim hatam sqlite programı açıkken kodları çalıştırmak . sqllite programını kapatarak denediğimde hata oluşmadı…,