Я пытаюсь выбрать строку по ее значению id из базы данных, и я использую атрибут returns_rows
класса ResultProxy
, чтобы проверить, была ли возвращена строка перед вызовом fetchone()
.
Для этого я кодирую это:
book = db.execute("SELECT * FROM books WHERE isbn=:isbn", {"isbn": id})
if book.returns_rows is not True:
return "Not found."
book = book.fetchone()
// ...
Согласно документация, предполагается, что он вернет True
, если возвращается хотя бы строка. Но даже если значение id
не существует в базе данных, если заявление не оценивается как истинное.
Может ли кто-нибудь помочь мне понять, почему это происходит? Заранее спасибо.
Я пробовал это, но я изменил это, потому что в документации ясно указано значение returns_rows
только тогда, когда строки возвращаются из БД (в данном случае returns_rows
= True). Но спасибо за помощь.
Думаю, документация должна быть неправильно прочитана. Реализация returns_rows
зависит от нижнего курсора (который, как сказано в документации, выпускается сразу после создания операторов UPDATE). Базовый курсор также освобождается, когда строки исчерпаны. Но я не уверен, что это произойдет. перед вы пытаетесь выполнить выборку. Вы пробовали проверить этот book is None
вместо book.returns_rows is not True
?
@nutic Я пробовал это, и он работает правильно. Но мне было интересно, почему этот атрибут не работал в моем операторе if. Я еще мало знаю о базе данных, но нужно ли мне использовать курсор «вручную», чтобы для этого атрибута было установлено значение True? Я спрашиваю об этом, потому что пытался использовать его с оператором UPDATE, но это тоже не сработало. Я не уверен, что делаю не так. В документации я вижу только этот True if this ResultProxy returns rows.
, но спасибо за вашу помощь.
Согласно реализации returns_rows = True, когда курсор db открыт, что означает, что вы можете попытаться получить некоторые данные из этого курсора. Но нет никакой гарантии, что есть какие-либо данные для выборки, если вы не попытаетесь это сделать. Что касается вашего вопроса, я бы не рекомендовал прикасаться к базовому курсору вручную, поскольку SQLAlchemy должен инкапсулировать его, а методов fetch * должно быть достаточно для ваших нужд.
«Согласно документации, предполагается, что он вернет True, если будет возвращена хотя бы строка». неправильное прочтение. «Истинно, если ResultProxy
возвращает строки». не означает, что «SELECT вернет строки, если True», но вместо этого результат запроса мощь возвращает строки вообще (например, результат CREATE TABLE не будет возвращать строки), и поэтому можно вызывать методы fetch *. Почему бы вам не спросить о случае с оператором UPDATE, который на самом деле не работает?
Когда я читал документацию, мне казалось, что я хорошо понял, но на самом деле этого не произошло. Я собираюсь подробнее изучить БД, чтобы лучше понять этот атрибут. Я ценю всю помощь.
Вместо этого используйте cursor.fetchone() is not None
:
book = db.execute("SELECT * FROM books WHERE isbn=:isbn", {"isbn": id})
book = book.fetchone()
if book is None:
return "Not found."
Не по теме: Вместо
if var is not True:
лучше использовать простоif not var:
.