SQLite ile veri çekmek

def siparistamamla(musteribakiye):
	musteribakiye = musteribakiye
	musterihizno = musterihiznosu1.get()
	musteriismi = isimsoyisim1.get()
	musteriadresi = musteriadresi1.get()
	urunadi1 = urunadis.get()
	urunfiyati1 = urunfiyatis.get()
	urunstokadeti1 = urunstokadetis.get()
	urunstokeksiltme = int(urunstokadeti1) - 1
	uruntutarfiyati1 = float(urunfiyati1) - int(musteribakiye)
	uruntutar = float(uruntutarfiyati1)
	tarih1 = str(datetime.datetime.now())
	print(tarih1) 
	değer_gir = "INSERT INTO siparisler VALUES ('en son id gelecek','"+musterihizno+"', '"+musteriismi+"', '"+musteriadresi+"','"+urunadi1+"','"+str(uruntutar)+"','"+tarih1+"')"
	cursor.execute(değer_gir)
	print("Siparişiniz Veritabanına Eklendi")

veritabanımda siparisler isminde bulunan tablodan id kısmının en son idsini alıp kaydettirmek istiyorum nasıl yapabilirim?

yokmu yardım edebilecek kişi?

Normalde aşağıdaki gibi yapabilirsiniz sanırım.

veriler = [i for i in cursor.execute("SELECT * FROM DATA")]
son_satirin_id_numarasi = veriler[-1][0]

çözdüm çok şükür gene teşşekkür ederim

def kasa_durumu():
		kasadurumu2panel = tk.Tk()
		kasadurumu2panel.title("Yönetici Müşterilerin Kasa Durumu Bölümü")
		kasadurumu2panel.resizable(FALSE,FALSE)
		kasadurumu2panel.geometry("1100x500")
		container = ttk.Frame(kasadurumu2panel)
		canvas = tk.Canvas(container)
		scrollbar = ttk.Scrollbar(container, orient="vertical", command=canvas.yview)
		scrollable_frame = ttk.Frame(canvas)

		scrollable_frame.bind(
		    "<Configure>",
		    lambda e: canvas.configure(
		        scrollregion=canvas.bbox("all")
		    )
		)

		canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")

		canvas.configure(yscrollcommand=scrollbar.set)

		find_user = ("SELECT * FROM musteriusers")
		cursor.execute(find_user)
		for musteri in cursor.fetchall():
			musterihizno1 = musteri[1]
			musteribakiye1 = musteri[3]
			musteriismi1 = "%s %s" % (musteri[4],musteri[5])

			la = Label(kasadurumu2panel)
			la.config(text=u"Müşteri Hiznosu Kasa Sahibi")
			la.grid(row=1,column=0)

			lb = Label(kasadurumu2panel)
			lb.config(text=u"%s" % musterihizno1)
			lb.grid(row=1,column=1)

			lc = Label(kasadurumu2panel)
			lc.config(text=u"Müşteri Adı Soyadı Kasa Sahibi")
			lc.grid(row=2,column=0)

			ld = Label(kasadurumu2panel)
			ld.config(text=u"%s" % musteriismi1)
			ld.grid(row=2,column=1)

			le = Label(kasadurumu2panel)
			le.config(text=u"Müşteri Kasa Durumu")
			le.grid(row=3,column=0)

			lf = Label(kasadurumu2panel)
			lf.config(text=u"%s" % musteribakiye1)
			lf.grid(row=3,column=1)

		container.pack()
		canvas.pack(side="left", fill="both", expand=True)
		scrollbar.pack(side="right", fill="y")

		kasadurumu2panel.mainloop()

musteriusers tablosunda iki satır veri varken bir satır çekiyor neden acaba bi bilgin var mı

Anladığım kadarıyla yazdığınız kodlara göre for musteri in cursor.fetchall(): döngüsünde oluşturduğunuz widgetler, ekranın hep aynı yerlerine yerleştiriliyor. Bu yüzden sanki tek bir veri alıyormuşsunuz gibi geliyor size. grid metodunun row ve column parametrelerine sabit bir değer atamak yerine döngü sayesinde değişen değerler atamalısınız.

pekala nasıl yapabilirim?

pekala nasıl yapabilirim efendim

Bu herhangi bir satirin ilk sutununu dondurur.

Ufak bir düzeltme yapayım. Herhangi bir satırın değil, son satırın ilk sütununu döndürür.

Öncelikle widget düzeninizin nasıl olacağını bilmiyorum. Yerleştirme işlemini bu düzene göre yapacaksınız. Ama örnek olarak nasıl yapabileceğinizi gösteren bir kod paylaşabilirim. Siz kodu inceleyip, kendi uygulamanıza göre değişiklikler yapabilirsiniz.

Mesela, aşağıdakiler sizin kodlarınız.

		for musteri in cursor.fetchall():
			lb = Label(kasadurumu2panel)
			lb.config(text=u"%s" % musterihizno1)
			lb.grid(row=1,column=1)

			lc = Label(kasadurumu2panel)
			lc.config(text=u"Müşteri Adı Soyadı Kasa Sahibi")
			lc.grid(row=2,column=0)

			ld = Label(kasadurumu2panel)
			ld.config(text=u"%s" % musteriismi1)
			ld.grid(row=2,column=1)

			le = Label(kasadurumu2panel)
			le.config(text=u"Müşteri Kasa Durumu")
			le.grid(row=3,column=0)

			lf = Label(kasadurumu2panel)
			lf.config(text=u"%s" % musteribakiye1)
			lf.grid(row=3,column=1)

Şimdi bu kodları aslında okuyabiliyor olmanız lazım. Beraber okuyalım. Veritabanındaki her bir musteri satırı için widgetler tanımlanacak. Güzel.

Peki bu widgetlerin grid metotları nasıl çağrılıyor? Sabit parametreler alarak.

Peki bu ne anlama gelir? Döngü sayesinde her seferinde oluşturulacak olan yeni widgetler, döngünün ilk basamağında oluşmuş olan widgetlerin yerine yerleştirilir.

Demek ki ekrana yerleştirmek için grid metoduna row=0, column=1 gibi sabit parametreler yazmamak gerekiyor.

O halde kodları şöyle değiştiriyorum:

                sayac = 1
		for musteri in cursor.fetchall():
			lb = Label(kasadurumu2panel)
			lb.config(text=u"%s" % musterihizno1)
			lb.grid(row=sayac, column=1)

			lc = Label(kasadurumu2panel)
			lc.config(text=u"Müşteri Adı Soyadı Kasa Sahibi")
			lc.grid(row=sayac + 1, column=0)

			ld = Label(kasadurumu2panel)
			ld.config(text=u"%s" % musteriismi1)
			ld.grid(row=sayac + 2, column=1)

			le = Label(kasadurumu2panel)
			le.config(text=u"Müşteri Kasa Durumu")
			le.grid(row=sayac + 3, column=0)

			lf = Label(kasadurumu2panel)
			lf.config(text=u"%s" % musteribakiye1)
			lf.grid(row=sayac + 3, column=1)
                        sayac += 3

Bakın burada sayac isminde bir değişken tanımladık. Ve bu değişken, döngü her başa sardığında, 3 birim artırılır. Dolayısıyla, her seferinde widgetler birbirlerinin üstüne değil, sürekli altına gelirler. Tabi bu durumu, oluşturmak istediğiniz widget düzenine göre yeniden belirleyebilirsiniz. Yani sabit bir sayı yerine, değişken kullanın demekten kastettiğim buydu.

Ben de duzelteyim o zaman :slight_smile:
Herhangi bir satirin degil, tablonun herhangi bir satirinin ilk sutununu dondurur.

Niye herhangi bir satır diyorsun hala anlamadım. :slight_smile:

veriler = [i for i in cursor.execute("SELECT * FROM DATA")]

verinin eklenme sırasını es mi geçiyor ki?

from sqlite3.dbapi2 import Connection

db = Connection("test.db")
db.execute('CREATE TABLE IF NOT EXISTS data(x, y, z)')
for i in range(10):
    db.execute('INSERT INTO data VALUES(?, ?, ?)', (i + 1, i * 2, i / 3))
db.commit()
veriler = [i for i in db.execute("SELECT * FROM data")]
print(veriler[-1][0])

Çıktı:

10

Herhangi bir yer değil., tabloya eklenen son satırın ilk sütunu. Ha diyorsan ki yeni bir veri satırı eklenince bir önceki son satırın ilk sütunundaki değeri alamayacağız, onda hemfikirim seninle. :slight_smile:

Cunku query sirali degil. Tablonun satirlarini herhangi bir sirayla istiyor; bu eklenme sirasi olabilir de olmayabilir de.

Bu tur testlerin kotu yani yanlis varsayimlari false positive olarak dogrulayabilmeleri. Bu bilgisayarda bu database’de su an dogru calistigi disinda bir seyi kanitlamiyor; standarda bakmak lazim* :confused:

Bu arada bu database’lerle calisirken yapilan ilk programci hatalarindan bir tanesi :slight_smile: Hayirli olsun.


Bakmadim. *'a baktim, kolonlari tanimini okumadigim bir sirada veriyor.

1 Beğeni

There is no explicit default ordering. For obvious reasons, if you create a new table, insert a few rows and do a “select *” without a “where” clause, it will (very likely) return the rows in the order they were inserted.

But you should never ever rely on a default order happening. If you need a specific order, use an “order by” clause.

SELECT * FROM ifadesi her şeyi seçmenin gerekmediği durumlarda kullanılması pek tavsiye edilmeyen bir seçme yöntemi. Ancak alıntı da bahsedildiği gibi, satır verilerini çekme sırası satırların yazılma sırasıyla alakalı gibi görünüyor. Bu yüzden paylaştığım kod eklenen son satır ve ilk sütunu döndürüyor. Bu durumun farklı bilgisayarlarda farklı sonuç üreteceğini düşünmüyorum. Very likely aynı sonucu alacaksın. :slight_smile:

1 Beğeni

Su daha iyi:

If a SELECT statement that returns more than one row does not have an ORDER BY clause, the order in which the rows are returned is undefined.

1 Beğeni

Ön-tanımlı bir sıralaması yok ancak satırların eklenme sırasına göre değer döndürdüğüne dair bir gözlem/deneyim de var. Keşke farklı bir sonuçla karşılaşsam da bu ifade tam anlamıyla deneyimle desteklenmiş olsa.

1 Beğeni

Aradan row silmeyi deneyebilirsin.
Row’lari farkli transaction’larda, veya farkli level’da kilitler tutarken eklemeyi deneyebilirsin.
Row’lar arasindaki boslugun (veya en azindan tablonun) sayfa boyunu gecmesi gerekebilir (4 Kib, 4 Mib)
Kolonlarda index olup olmamasi, indexte bosluk olup olmamasi sonucu etkileyebilir.

Row’larin sirasiz gelmesi teknik olarak bir optimizasyon oldugu icin normalde optimize edilecek workload’lara bakmak lazim. Uc index’siz kolonla yaratilip bir kere query edilen tablo normal bir workflow degil.

Edit: Butun bunlara alternatif herhangi bir production database’ine query yapmak olabilir. Row’larin sirali dondugunu hic gormedim.

1 Beğeni

Şu ana kadar hiç transaction yapmak ile işim olmadı. Biraz bu konuda okumalar yapmam ve örnekler üzerinde çalışmam lazım. Paylaştığın bilgiler için teşekkür ederim.

1 Beğeni