Атрибут Returns_rows не работает - SQLAlchemy

Я пытаюсь выбрать строку по ее значению 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 не существует в базе данных, если заявление не оценивается как истинное.

Может ли кто-нибудь помочь мне понять, почему это происходит? Заранее спасибо.

Не по теме: Вместо if var is not True: лучше использовать просто if not var:.

Ivan Velichko 01.05.2018 12:22

Я пробовал это, но я изменил это, потому что в документации ясно указано значение returns_rows только тогда, когда строки возвращаются из БД (в данном случае returns_rows = True). Но спасибо за помощь.

Wesley Gonçalves 01.05.2018 12:39

Думаю, документация должна быть неправильно прочитана. Реализация returns_rows зависит от нижнего курсора (который, как сказано в документации, выпускается сразу после создания операторов UPDATE). Базовый курсор также освобождается, когда строки исчерпаны. Но я не уверен, что это произойдет. перед вы пытаетесь выполнить выборку. Вы пробовали проверить этот book is None вместо book.returns_rows is not True?

nutic 01.05.2018 16:15

@nutic Я пробовал это, и он работает правильно. Но мне было интересно, почему этот атрибут не работал в моем операторе if. Я еще мало знаю о базе данных, но нужно ли мне использовать курсор «вручную», чтобы для этого атрибута было установлено значение True? Я спрашиваю об этом, потому что пытался использовать его с оператором UPDATE, но это тоже не сработало. Я не уверен, что делаю не так. В документации я вижу только этот True if this ResultProxy returns rows., но спасибо за вашу помощь.

Wesley Gonçalves 01.05.2018 18:38

Согласно реализации returns_rows = True, когда курсор db открыт, что означает, что вы можете попытаться получить некоторые данные из этого курсора. Но нет никакой гарантии, что есть какие-либо данные для выборки, если вы не попытаетесь это сделать. Что касается вашего вопроса, я бы не рекомендовал прикасаться к базовому курсору вручную, поскольку SQLAlchemy должен инкапсулировать его, а методов fetch * должно быть достаточно для ваших нужд.

nutic 01.05.2018 19:04

«Согласно документации, предполагается, что он вернет True, если будет возвращена хотя бы строка». неправильное прочтение. «Истинно, если ResultProxy возвращает строки». не означает, что «SELECT вернет строки, если True», но вместо этого результат запроса мощь возвращает строки вообще (например, результат CREATE TABLE не будет возвращать строки), и поэтому можно вызывать методы fetch *. Почему бы вам не спросить о случае с оператором UPDATE, который на самом деле не работает?

Ilja Everilä 02.05.2018 08:40

Когда я читал документацию, мне казалось, что я хорошо понял, но на самом деле этого не произошло. Я собираюсь подробнее изучить БД, чтобы лучше понять этот атрибут. Я ценю всю помощь.

Wesley Gonçalves 05.05.2018 16:50
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
247
1

Ответы 1

Вместо этого используйте 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."

Другие вопросы по теме