2016-03-20 24 views
2

Bir metin sorgusunun dize bölümünü değerlerle uydurmanın doğru yolunun iyi bir örneğini bulamıyorum. Örneğin: Bu çalışmaz. Derleyici, syntax error: unexpected comma, expecting) 'u döndürür. Python stili bir tuple kullanmaya çalışıyorum.Bir metin yazmak için doğru yol Git sorgusunda SQL sorgusu

ben tanımlama grubu sorunlarına BİRİ olduğunu söylüyor (mismatched types string and int) olsun

query := `SELECT column_name FROM table_name 
     WHERE column1_name = %d AND column2_name = %d` % val1 

olarak yeniden edin.

Ben ilk dizeleri olarak benim parametrelerini dökme, ben ben sadece döküm biliyorum (operator % not defined on string)

piton olarak,

query = """SELECT column_name FROM table_name 
    WHERE column1_name = %d 
    AND column2_name = %d""" % (val1, val2) 

VEYA

query = """SELECT column_name FROM table_name 
    WHERE column1_name = %s 
    AND column2_name = %s""" % (val1_string, val2_string) 

gibi bir şey yapardım olsun "STRING" + var + "STRING" ile dizeleri ve concat olarak değerler, ama bu python sürümü ile karşılaştırıldığında gerçekten dağınık görünüyor. Go'daki bu python kodunun karşılığı nedir? Özellikle, tuple bölümünü ve bir dizeyi ve bir tamsayıyı birleştirerek. çünkü enjeksiyon açıklarını SQL ifadeleriyle dize interpolasyon kullanma hakkında

+0

Eğer 'Sprintf' aradığınız: olarak

query := fmt.Sprintf('SELECT columnA FROM tableA WHERE columnB = %d AND columnB = %s', someNumber, someString) 

, enjeksiyon sorunları önlemek İlk kod yazmak için mi? –

+1

, size referans vermek istediğim harika bir video var: golang'daki veritabanı nasıl yapılır: https://www.youtube.com/watch?v=m879N2rzn2g – Roylee

cevap

2

< standart Uyaran>

Bu işlemek için fmt.Sprintf kullanabilirsiniz.

query := `SELECT column_name FROM table_name 
    WHERE column1_name = %d AND column2_name = %d` 

rows, err := db.Query(query, val1, val2) 
+0

Bu, SQL enjeksiyonu, başka bir komutu sonlandıran ve çalıştıran sorguya özel olarak hazırlanmış bir değer veriyor, örn. '1 'dir; DROP TABLE tablosuA. Şimdi görünüşte iyi huylu seçme sorgunuzu çalıştırdığınızda, aslında tablonuzu düşürür. –

+0

@jniedrauer bu harika çalışıyor! Ama yaptığınız şeyin tam tersi :). Herhangi bir üretim SQL API'sı, enjeksiyon geçirmez enterpolasyon seçeneklerine sahip olacaktır. Dilde yapmak (yukarıda yaptığınız gibi Python'da bile) enjeksiyon yapmaya eğilimlidir. –

+0

bobby-tables.com adresinden alındı: '# Bu şekilde yapmayın. ' ' cmd = "Kişileri ayarla adı değiştir ='% s 'burada id ='% s '"% (name, id) ' 'curs.execute (cmd)' '#Instead bunu yapmak:' 'cmd = "güncelleme insanlar name =% s set nerede id =% s"' 'curs.execute (cmd, (isim, id)) Ancak Go's MyMySQL ile bunu yapmanın bir yolunu göremiyorum. Belki de sadece RTFM yeterince sert değildi. Bu girdiyi kodun önüne geçmeden önce enjeksiyonun önlenmesi için özellikle tamsayı olarak girdim. Bence sadece MyMySQL'de bir metin sorgusu yazmanın doğru yolunu bilmem gerekiyor ... –