2013-05-15 25 views
21

Tôi có một câu lệnh sql trả về không có lần truy cập nào. Ví dụ: 'select * from TAB where 1 = 2'.Python, cách kiểm tra xem tập kết quả có trống không?

Tôi muốn kiểm tra có bao nhiêu hàng được trả về,

cursor.execute(query_sql) 

rs = cursor.fetchall() 

Ở đây tôi đã có được ngoại lệ: "(0, 'Không có kết quả thiết lập')"

Làm thế nào tôi có thể prevend ngoại lệ này, kiểm tra liệu tập kết quả có trống không?

+0

Cơ sở dữ liệu này là gì? Tôi sẽ không mong đợi một ngoại lệ ở đây, thay vì '.fetchall()' trả về một danh sách rỗng. –

Trả lời

24

cursor.rowcount sẽ được thiết lập là 0.

Tuy nhiên, nếu bạn đang chạy một tuyên bố rằng sẽ không bao giờ trả về một tập kết quả (ví dụ như INSERT hoặc SELECT ... INTO), sau đó bạn không cần phải gọi .fetchall(); sẽ không có kết quả nào được đặt bao giờ cho các tuyên bố như vậy. Gọi số .execute() là đủ để chạy câu lệnh.

+1

trong tập lệnh của tôi, tôi thực hiện một danh sách các câu lệnh sql, đo thời gian chạy và số lần truy cập của chúng. Tôi không thể biết trước nếu một tuyên bố được chọn hoặc chèn, là có một cách để tôi biết sau mỗi lần thực hiện truy vấn cho dù có một resultset ở tất cả? Cảm ơn rất nhiều. –

+0

@TaoVenzke: Sử dụng 'try: results = cursor.fetchall()' sau đó bắt ngoại lệ với trình xử lý 'except'? Không phải tất cả các cơ sở dữ liệu đều có ngoại lệ trong trường hợp này, bạn đang sử dụng cơ sở dữ liệu nào ở đây? –

+0

Tôi đang sử dụng cơ sở dữ liệu SAP HANA. Tôi đã làm nó với TRY, và một ngoại lệ bị bắt. Nhưng tôi muốn tránh ngoại lệ trong trường hợp này. con trỏ.rowcount khá khó hiểu: nó trả về -1 cho câu lệnh select; nó trả về NOT 0 cho câu lệnh chèn, số mà nó trả về dường như là số lượng các bản ghi được chèn vào, nhưng tôi có thể thực sự tin tưởng nó không? –

11

MySQLdb sẽ không tăng ngoại lệ nếu tập kết quả trống. Ngoài ra hàm cursor.execute() sẽ trả về một giá trị dài là số hàng trong tập kết quả tìm nạp. Vì vậy, nếu bạn muốn kiểm tra cho kết quả rỗng, mã của bạn có thể được viết lại như Thông báo

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

Hoạt động rất tốt với Oracle! – Gistack

4

: này là dành cho mô-đun MySQLdb bằng Python.

Đối với tuyên bố SELECT, không được có ngoại lệ cho bản ghi trống. Chỉ một danh sách trống ([]) cho cursor.fetchall()None cho cursor.fetchone().

Đối với bất kỳ tuyên bố nào khác, ví dụ: INSERT hoặc UPDATE, không trả lại bản ghi, bạn không được gọi fetchall() cũng như fetchone() trên con trỏ. Nếu không, một ngoại lệ sẽ được nâng lên.

Có một cách để phân biệt giữa hai loại trên của con trỏ:

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

nếu bạn đang kết nối với một cơ sở dữ liệu Postgres, các công việc sau:

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ạn có thể làm như thế này :

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") 

Xin cảm ơn :)

+0

Khi đăng câu trả lời, hãy cố gắng giải thích tại sao câu trả lời này giải quyết được vấn đề, cùng với chính mã đó. – David

Các vấn đề liên quan