2013-05-15 32 views
21

我有一个没有命中返回的sql语句。例如,'select * from TAB where 1 = 2'Python,如何检查结果集是否为空?

我要检查多少行被返回,

cursor.execute(query_sql) 

rs = cursor.fetchall() 

在这里,我找到一些例外:“(0,‘没有结果集’)”

我怎样才能PREVEND此异常,检查结果集是否为空?

+0

这是什么数据库?我不希望这里出现异常,而是'.fetchall()'返回一个空列表。 –

回答

24

cursor.rowcount将然而,如果你正在运行的将从未返回结果集(如INSERTSELECT ... INTO),那么你并不需要调用.fetchall()声明被设置为0

;对于这样的语句将不会有结果集有史以来。调用.execute()就足以运行该语句。

+1

在我的脚本中,我执行一个sql语句列表,测量它们的运行时间和点击次数。我不能事先知道一个语句是选择还是插入,在每个查询执行后有没有一种方法可以让我知道是否有结果集?非常感谢。 –

+0

@TaoVenzke:使用'try:results = cursor.fetchall()'然后用'except'处理程序捕获异常?在这种情况下,并非所有的数据库都会抛出异常,您在这里使用了哪个数据库 –

+0

我正在使用SAP HANA数据库。我用TRY做到了,发现了一个异常。但我想在这种情况下避免例外。光标。rowcount非常令人困惑:它为select语句返回-1;它返回NOT 0为插入语句,它返回的数字似乎是插入的记录数,但我真的可以相信它吗? –

11

如果结果集为空,MySQLdb不会引发异常。此外,cursor.execute()函数将返回一个long值,该值是获取结果集中的行数。所以,如果你想检查空的结果,你的代码可以被重新写为

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

与Oracle工作得很好! – Gistack

4

注:这是在Python MySQLdb的模块。

对于SELECT语句,空记录集不应该有例外。对于cursor.fetchall()None只是一个空列表([]),对于cursor.fetchone()

对于任何其他陈述,例如INSERTUPDATE,即不返回记录集,您既不能在光标上调用fetchall()也不能调用fetchone()。否则,会引发异常。

有上述两种类型的游标来区分的一种方法:

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

,如果你连接到一个Postgres数据库,以下工作:

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

你可以这样做:

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

谢谢:)

+0

发布答案时,尝试解释为什么此答案与代码本身一起解决了问题。 – David

相关问题