Python mysqlde değişken kullanımı

Uzun uğraşmalardan sonra mysql-python bağlantısını sağlayabildim ve mysql öğrenmeye başladım.
mysql de değişken kullanımı öğrenmeye çalışıyorum.

sqlcommand = ("INSERT INTO 'ana'('algi','nesne') values (e1.get(),e2.get())" )

# "e1" ve "e2", tkinter ile yaptığım arayüzün entry alanları.

# bu kodlar aşağıdaki hatayı veriyor.
##You have an error in your SQL syntax; check the manual that corresponds
##to your MySQL server version for the right syntax to use near
##''ana'('algi','nesne') values (e1.g' at line 1

## aşağıdaki kodlarda ise;
set @a = e1.get()
set @b = e2.get()

sqlcommand=("INSERT INTO 'ana'('algi','nesne') values (@a,@b)")

im.execute(sqlcommand) 
##set komutunun önünde kırmızı imleç ve "can't assign to operator" uyarı mesajı çıkıyor.

Nereye baktımsa çözüm bulamadım. Acaba syntax’ta mı, yoksa python-mysql bağlantımda mı sorun var(stackoverflow’da benzer bir soruna bağlantıyı iptal edip yeniden kurmayı önermişler). Aslında bağlantıdan şüphelenmem için bir konu daha var. Bir Db oluşturdum, tablo yaptım, arayüz yaptım ve giriş yapmaya çalışırken yukarıdaki hataları alıyorum. tkinter ile yaptığım arayüze giriş yapıp “kaydet” tuşuna basana kadar hata mesajı yok. (çoktu da, teker teker hallettim zaman içinde). Ama Db dosyamı bilgisayarımda bulamıyorum. Python altında da yok, sistemden arattığımda da “eşleşme bulunamadı” mesajı veriyor. Ama aynı isimle yeniden “Create Database…” dediğimde, “database allready exist” diyor.

Burdaki örenğe bakabilirsin.

@a böyle birşeyi ilk defa görüyorum ?

https://www.w3schools.com/python/python_mysql_insert.asp

İlginize teşekkürler. Verdiğiniz linkteki örneğe ve belki onlarcasına baktım daha önce, mysql’.n kendi dökümanları dahil. Anlayabildiğim kadarı ile tabii, ingülizcem çokiyi değil. Ben values’e bir değer değil, bir değişken girmek istiyorum. Tkinter de yaptığım giriş penceresinden her ne değer giriliyorsa, onu INSERT… satırına VALUES olarak girmek istiyorum.SET @e1 ise, giriş penceresinin e1 alanına girilen değeri temsil ediyor. Yani etmeli, ama etmiyor işte. Neden? Mysql dökümanı değişken tanımı için bunu öneriyor.
https://dev.mysql.com/doc/refman/5.7/en/set-variable.html

Bu değişken tanımlama şekli Python’da yok. Verdiğiniz link, SQL scriptleri için anlatım yapmış. MySql workbench programını açtığınızda karşınıza gelen SQL sorgu ekranına bunları yazabilirsiniz.

3 Beğeni

şöyle deneyebilirsin…

aslında değerleri demet şeklinde vermek daha yaygın. yinede siz bilirsinz.

e1Degeri = e1.get()
e2Degeri = e2.get()

sqlcommand=("INSERT INTO ana('algi','nesne') values ("+e1Degeri+","+e2Degeri+ ")")


1 Beğeni

Konuyla doğrudan ilgili değil ama bir uyarıda bulunayım. Aldığınız değerleri mutlaka kontrol edin. Etmezseniz SQL injection’lara maruz kalabilirsiniz.

2 Beğeni

Teşekkür ederim. Pythonda olmadığını biliyordum. Fakat mysql’de var ve python da mysql’i veritabanı uygulamaları için kabul ediyor. Bu yüzden “SET” li sorguları python’un da bir şekilde tanıyabileceğini düşündüm. demek yanılmışım.

1 Beğeni

Rica ederim. Herşey yolunda mı?

1 Beğeni

Teşekkür ederim. Sorunu sqlite içinde çözdüm.

im.execute("select water from ana where no=(select max(no) from ana)")
a1 = im.fetchall()
for i in a1:
    ee4 = int(i[0])
#önce son satırdaki "water" kolonu değerini "ee4" değişkenine atıyorum. Aşağıda da bu değişkeni values içinde kullanıyorum.

if ee4 < 50:
        im.execute("insert into ana(algi,nesne,eylem,water,food,love,bilge) values (?,?,?,?,?,?,?)",
        (e1.get(),e2.get(),e3.get(),ee4,ee5,ee6,'su ver',))

ufak tefek bazı sorunlar hala var burada, uğraşıyorum.

Teşekkürler, ama olmadı. Biraz farklı şekilde yararlandım önerinizden. Aşağıda paylaştım. Tekrar teşekkürler.

1 Beğeni

Merhaba. Mysql workbench’te yazdığım bir sorguyu ya da script shell’de yazdığım bir scripti python içinde nasıl kullanabilirim? Nasıl kaydetmeliyim ve nasıl çağırmalıyım? iki gündür didikliyorum ama bulamadım. sanırım çok basit bazı şeyleri atlıyorum. Açıklarsanız memnun olacağım. teşekkürler.

1 Beğeni

Aslında script yazarken kullandığınız deyimleri, Python’da sorgu yaparken de kullanabilirsiniz. Bunun için sorgulama yaparken multi = True yazmanız yeterli. Örnek komut

operation = """
SELECT 1;
INSERT INTO t1 VALUES ();
SELECT 2
""" # birden fazla komut

cursor.execute(operation, multi=True)

Şu sayfadan daha fazla bilgi alabilirsiniz.

https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html

Cevap için teşekkürler. Verdiğiniz linkten anladığım, multi=True yazmakla, birden fazla sorguyu tek bir execute() deyimi ile yapabileceğimiz. Ben python’da yazdığım bir fonksiyonu workbench’te çalıştıramıyorum ve Workbench’te yazdığım bir sorguyu nasıl python dosyama import edeceğimi bilmiyorum. Acaba programın tümünü (belki yüzlerce satır) workbench scripting shell’de script, modül veya class olarak yazmak mümkün mü, yani orayı python IDLE gibi kullanmak? değilse, workbench’te yazdığım

“SET @variable…” sorgusunu ve aldığım değeri python’daki fonksiyonumda nasıl kullanırım? Başlangıçta, mysql connector’u import etmenin bütün bu sorunları çözeceğini sanıyordum. Neyi atlıyorum?

Daha somut olarak:


def deger_secme():

    im.execute( "select no,max(duygu) from ana where  

                duygu is not null and duygu !=''")

    ödül = im.fetchone()

    tek=ödül[0] # ödül değerini liste içinden çekmek için yeni değişken

    im.execute("select algi from ana where no = 'tek'")

    sıra=im.fetchall()

    print(sıra)

Bu işlemi python’da yapamıyorum. Anladığım kadarı ile sqlite INSERT ve UPDATE komutları için değişken kullanmayı kabul ediyor (VALUES (?;?) gibi), ama SELECT komutu için kabul etmiyor. Ben işte bunu çözmek için mysql sorgusunu python içinde kullanmak istiyorum. Ya da mysql içinde python fonksiyonları kullanmak.

Uzun yazdığım için özür dilerim, derdimi daha kısa nasıl anlatacağımı bilemiyorum galiba. ilginiz için şimdiden teşekkürler.

Yok sorun değil, uzun olması daha iyi :slight_smile:

MySql içerisinde Python kullanamazsınız ama, Python içerisinde MySql kullanabilirsiniz. Yukarıdaki kodun neden çalışmadığını merak ettim. Acaba hata veriyorsa, hata mesajını buraya kopyalama şansınız var mı?

Mesela şöyle bir sorgu, Python içerisinde çalışıyor

sorgu = """
SET @sayi = '2';
SELECT * FROM tablo WHERE id = @sayi;
"""

imlec.execute(sorgu)

Eğer, sorgularınızı bir script dosyanızın içine yazdıysanız bu dosyayı Python içerisinde okuyup satır satır çalıştırabilirsiniz.

with open("sorgular.sql","r") as script:
    for satir in script.readlines():
        imlec.execute(satir)

“Can’t assign to operator” mesajı alıyorum ve imleç SET ifadesinin başında kırmızı olarak duruyor.
Aşağıdaki kodları workbench’in örnek veritabanı “sakila” için uyguladım. Son kayıt 200 ve ben sonuç olarak 199 u bir değişken(sıra) içinde almak istiyorum. SET kullanmazsam, bana boş bir liste veriyor. Kullanırsam hata veriyor.

def deger_secme():
    im.execute( "select max(actor_id), first_name from actor")
    ödül = im.fetchone()
    tek=ödül[0]
    print(tek)  # 200 olarak alıyor 
    SET @sayi = tek-1
    
    im.execute("select last_name from actor where actor_id = @sayi")
    sıra=im.fetchone()
    
    print(sıra)# sonuç []
deger_secme()

SET kullandığınız yer yanlış. Şu şekilde olmalı

def deger_secme():
    im.execute( "select max(actor_id), first_name from actor")
    ödül = im.fetchone()
    tek=ödül[0]
    print(tek)  # 200 olarak alıyor 
    
    im.execute("""SET @sayi = {deger};select last_name from actor where actor_id = @sayi""".format(deger = int(tek)-1))

    sıra=im.fetchone()
    
    print(sıra)# sonuç []
deger_secme()

Minnettarım, hakkınızı helal edin. Ama sonuç FAWCETT olması gerekirken None veriyor.

1 Beğeni

Kusura bakmayın, yukarıda multi = True kullanımıyla ilgili bir durum daha vardı. Onun önemsiz olduğunu düşünmüştüm ancak sıkıntıyı çözdüm. Eğer multi olarak komut çalıştırırsanız şu şekilde dönen sonuçları kontrol edebilirsiniz

def deger_secme():
    im.execute( "select max(actor_id), first_name from actor")
    odul = im.fetchone()
    tek=odul[0]
    
    tek = str(int(tek)-1) # 199

    sorgu = ("SET @sayi = %s;"
             "select last_name from actor where actor_id = @sayi")

    data = [tek] # Burada, %s yerine gelecek verileri yazıyoruz

    for sonuc in im.execute(sorgu,data,multi = True):
        if(sonuc.with_rows): # Eğer sıra ile çalışan komutlardan birinde veri çekilmişse, yani SELECT kullanılmışsa
            sira = im.fetchone() # Bunu alıyoruz
            print(sira)
    
deger_secme()

Asıl siz hakkınızı helal edin :slight_smile:

2 Beğeni

Çok teşekkür ederim, doğru sonucu aldım. Bu kodları sindirebilmek için birkaç gün harcamam gerekiyor, bu da öğrenmenin bir yolu. Kolaylıklar ve başarılar diliyorum.

1 Beğeni