2016-03-23 18 views
1

SQLite ve Python'da çalışıyorum. Sadece kullanıcı komutları veritabanı nesneleri olarak kullanarak bir TABLO oluşturmaya çalışıyorum. Çok güzel işlerpython ile bir sqlite tablosunu modellemek için sadece değişkenleri kullanın

new_table = raw_input('Enter a table name: ') 
column = raw_input('Enter column name: ') 

cur.execute(''' CREATE TABLE IF NOT EXISTS {tn} ({col})'''\ 
    .format(tn = new_table, col = column)) 

ve bunu sezgisel bulmak: Bazı kapsamlı aramalar sonra bu yöntemi buldum (! Resmi belgeler bu tür ilişkin hiçbir bilgi vermemektedir sözdizimi-lütfen beni düzeltin). Sorunum INSERT INTO sözdizimi ile. Aşağıdaki kod ok işe yararken:

insdata = raw_input('Insert data for column: ') 
cur.execute("INSERT INTO {tn} ({col}) VALUES (?)", (insdata,)\ 
    .format(tn=new_table, col=column)) 

yanılma ile başarısız:

cur.execute("INSERT INTO {tn} ({col}) VALUES (?)", ('goodmorning')\ 
    .format(tn=new_table, col=column)) 

aşağıda Bu kod, işe yaramaz 'tanımlama grubu' nesne hiçbir özellik biçimi vardır.

Soru geçerli: SQLite VALUES için insdata değer atamak doğru sözdizimi nedir? Bu biraz daha net moda yazarsanız

cur.execute("INSERT INTO {tn} ({col}) VALUES ({val})".format(tn=new_table,col=column,val='goodmorning')) 

cevap

1

görürsünüz:

+0

Tanrım, tuple'ı biçimlendiriyordum ... Merakla, küme parantezlerinde değişkenler kullanmak yerine başka bir yol var mı? Değilse, yukarıdaki sözdizimi/yöntem nerede belgelenir? Db tablo ve sütunlarına değişken isimleri atamak için bu formatlama yöntemini nasıl öğrenmiş olabilir? Ve elbette, bu kadar zamanında ve tutarlı bir cevap için çok teşekkür ederim! – ToucHDowN

+0

@ToucHDowN Veri tabanlarına özgü değil, genel dize biçimlendirme sözdizimi. Dokümantasyon [burada] (https://docs.python.org/2.7/library/string.html#format-string-syntax). Güvenilir olmayan kullanıcı girdisi olan veritabanlarında herhangi bir şey yapmanın tehlikeli olabileceğine dikkat edin. – glibdud

+0

@glibdud referans için çok teşekkür ederim. Şimdiye kadar (.strip/split, vs) bazı temel str metodlarını inceledim ama .format'a bile dokunmadım. Bu yüzden, kaşlı ayraçları olan yukarıdaki SQL deyimi bana yabancı gibi geldi. Şimdi temizle, teşekkürler. – ToucHDowN

1

yerine SQL sorgusu ile bir dize sen (birine sahip olmadığı görülüyor) başlığın biçim yöntemini çağırıyoruz düşünüyorum Neler oluyor:

cur.execute(
    "INSERT INTO {tn} ({col}) VALUES (?)", 
    (insdata,).format(tn=new_table, col=column) 
) 

Dizgiyi biçimlendirmiyorsunuz, bir argüman dizisini biçimlendiriyorsunuz. (Eğer bir işlev çağrısı içindeler beri), satır devam karakteri hiç gerekli değildir Bu durumda

sql = "INSERT INTO {tn} ({col}) VALUES (?)".format(tn=new_table, col=column) 
cur.execute(sql, (insdata,)) 

ama eğer:

cur.execute(
    "INSERT INTO {tn} ({col}) VALUES (?)".format(tn=new_table, col=column), 
    (insdata,) 
) 

ya da belki biraz daha net: Bunun yerine, istediğiniz Bir nesne ile nesne üzerindeki yöntem çağrısı arasında değil, argümanlar arasında konumlandırılması çok daha anlamlı olacaktır.

İlgili konular