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.
İ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.
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.
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.
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.
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)
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.
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()
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()
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()
Ç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.