Python, как проверить, пуст ли набор результатов?
У меня есть оператор sql, который не возвращает никаких обращений. Например, 'select * from TAB where 1 = 2'
.
Я хочу проверить, сколько строк возвращено,
cursor.execute(query_sql)
rs = cursor.fetchall()
Здесь я получаю уже исключение: "(0," Нет набора результатов ")"
Как я могу превзойти это исключение, проверьте, пуст ли набор результатов?
Ответы
Ответ 1
cursor.rowcount
будет установлен в 0.
Однако, если вы выполняете оператор, который никогда не вернет набор результатов (например, INSERT
без RETURNING
или SELECT... INTO
), вам не нужно вызывать .fetchall()
; для таких утверждений не будет набора результатов. Вызов .execute()
достаточно для запуска оператора.
Ответ 2
MySQLdb не будет создавать исключение, если набор результатов пуст. Кроме того, функция cursor.execute() возвращает длинное значение, которое представляет собой количество строк в выбранном наборе результатов. Поэтому, если вы хотите проверить пустые результаты, ваш код может быть переписан как
rows_count = cursor.execute(query_sql)
if rows_count > 0:
rs = cursor.fetchall()
else:
// handle empty result set
Ответ 3
У меня были проблемы с количеством строк, которые всегда возвращали -1 независимо от того, какое решение я пробовал.
Я нашел следующую хорошую замену, чтобы проверить нулевой результат.
c.execute("SELECT * FROM users WHERE id=?", (id_num,))
row = c.fetchone()
if row == None:
print("There are no results for this query")
Ответ 4
Примечание. Это для модуля MySQLdb в Python.
Для оператора SELECT
не должно быть исключения для пустого набора записей. Просто пустой список ([]
) для cursor.fetchall()
и None
для cursor.fetchone()
.
Для любого другого оператора, например. INSERT
или UPDATE
, который не возвращает набор записей, вы не можете называть 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
Ответ 5
если вы подключаетесь к базе данных 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
Ответ 6
Вы можете сделать следующее:
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")
Спасибо:)