I have a sql statement that returns no hits. For example, 'select * from TAB where 1 = 2'
.
I want to check how many rows are returned,
cursor.execute(query_sql)
rs = cursor.fetchall()
Here I get already exception: "(0, 'No result set')"
How can I prevend this exception, check whether the result set is empty?
MySQLdb will not raise an exception if the result set is empty. Additionally cursor.execute() function will return a long value which is number of rows in the fetched result set. So if you want to check for empty results, your code can be re-written as
You can do like this :
Thanks :)
cursor.rowcount
will usually be set to 0.If, however, you are running a statement that would never return a result set (such as
INSERT
withoutRETURNING
, orSELECT ... INTO
), then you do not need to call.fetchall()
; there won't be a result set for such statements. Calling.execute()
is enough to run the statement.Note that database adapters are also allowed to set the rowcount to
-1
if the database adapter can't determine the exact affected count. See the PEP 249Cursor.rowcount
specification:The
sqlite3
library is prone to doing this. In all such cases, if you must know the affected rowcount up front, execute aCOUNT()
select in the same transaction first.I had issues with rowcount always returning -1 no matter what solution I tried.
I found the following a good replacement to check for a null result.
Notice: This is for MySQLdb module in Python.
For a
SELECT
statement, there shouldn't be an exception for an empty recordset. Just an empty list ([]
) forcursor.fetchall()
andNone
forcursor.fetchone()
.For any other statement, e.g.
INSERT
orUPDATE
, that doesn't return a recordset, you can neither callfetchall()
norfetchone()
on the cursor. Otherwise, an exception will be raised.There's one way to distinguish between the above two types of cursors:
if you're connecting to a postgres database, the following works: