2013-05-15 32 views
21

Hiçbir isabet döndürmeyen bir sql deyim var. Örneğin, 'select * from TAB where 1 = 2'.Python, sonuç kümesinin boş olup olmadığını nasıl kontrol edersiniz?

Ben döndürülür kaç satır kontrol etmek istiyorum,

İşte
cursor.execute(query_sql) 

rs = cursor.fetchall() 

Zaten istisna olsun: "(, 'Hayır sonuç set' 0)" Bu durum PREVEND nasıl

onay sonuç kümesi boş mu? ancak, , o zaman .fetchall() aramak gerekmez (örneğin INSERT veya SELECT ... INTO gibi) sonuç kümesi döndürmek asla bir açıklama çalıştırıyorsanız, varsa

+0

Bu veritabanı nedir? Burada bir istisna beklemem, daha doğrusu '.fetchall()' boş bir liste döndürür. Scriptimde –

cevap

24

cursor.rowcount 0.

olarak ayarlanır; Böyle bir ifade için hiç sonuç kümesi olmayacak. Bildirimi çalıştırmak için .execute() numaralı telefonu çağırmak yeterlidir. Sonuç kümesi boşsa MySQLdb bir istisna oluşturmaz.

+1

, sql ifadelerinin bir listesini yürütüyorum, çalışma zamanlarını ve isabet sayısını ölçüyorum. Bir deyim seçildiğinde veya eklendiğinde önceden bilmiyorum, her sorgu yürütme işleminden sonra bir sonuç kümesinin olup olmadığını bilmek için bir yol var mı? Çok teşekkürler. –

+0

@TaoVenzke: 'try: results = cursor.fetchall()' işlevini kullanın ve sonra 'except' işleyicisi ile özel durumu yakalayın. Tüm veritabanları bu durumda bir istisna atmaz, hangi veritabanını burada kullanıyorsunuz? –

+0

SAP HANA veritabanı kullanıyorum. Bunu TL ile yaptım ve bir istisna yakalandı. Ama bu durumda istisnadan kaçınmak istiyorum. imleç.rowcount oldukça kafa karıştırıcı: select deyimi için -1 döndürür; insert ifadesi için 0 değerini döndürür, döndürdüğü sayı eklenen kayıtların sayısı olarak görünür, ancak gerçekten buna güvenebilir miyim? –

11

Ayrıca, cursor.execute() işlevi, getirilen sonuç kümesindeki satır sayısı olan uzun bir değer döndürür. Boş Sonuçları kontrol etmek istiyorsanız, kodunuzu

rows_count = cursor.execute(query_sql) 
if rows_count > 0: 
    rs = cursor.fetchall() 
else: 
    // handle empty result set 
+0

Oracle ile çok iyi çalışıyor! – Gistack

4

Bildirimi olarak yeniden yazılabilir: Bu Python MySQLdb modülü içindir.

SELECT bildirimi için boş bir kayıt kümesi için istisna oluşturulmamalıdır. cursor.fetchone() için cursor.fetchall() ve None için boş bir liste ([]).

Başka bir ifade için, örn. INSERT veya UPDATE, bir kayıt kümesini döndürmez, imleçte ne fetchall() ne de fetchone()'u arayabilirsiniz. Aksi halde, bir istisna artırılacaktır.

imleçler yukarıdaki iki tip ayırt etmek tek yolu var:

def yield_data(cursor): 
    while True: 
     if cursor.description is None: 
      # No recordset for INSERT, UPDATE, CREATE, etc 
      pass 
     else: 
      # Recordset for SELECT, yield data 
      yield cursor.fetchall() 
      # Or yield column names with 
      # yield [col[0] for col in cursor.description] 

     # Go to the next recordset 
     if not cursor.nextset(): 
      # End of recordsets 
      return 
0

bir Postgres aşağıdaki işleri bağlanırken eğer:

result = cursor.execute(query) 

if result.returns_rows: 
    # we got rows! 
    return [{k:v for k,v in zip(result.keys(), r)} for r in result.rows] 
else: 
    return None 
0

Böyle yapabilirsiniz :

count = 0 
cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};" 
         "Server=serverName;" 
         "Trusted_Connection=yes;") 
cursor = cnxn.cursor() 
cursor.execute(SQL query) 
for row in cursor: 
    count = 1 
    if true condition: 
     print("True") 
    else: 
     print("False") 
if count == 0: 
    print("No Result") 

Teşekkür :)

+0

Bir yanıt gönderirken, bu cevabın kodu kendisi ile birlikte neden çözdüğünü açıklamaya çalışın. – David

İlgili konular