sqlalchemy cx_oracle не может получить результаты - PullRequest
0 голосов
/ 05 июля 2018

sqlalchemy + cx_Oracle может отсутствовать в вашем домене. Тем не менее, если вы можете помочь мне дать несколько веб-ссылок / справок, это будет хорошо.

from sqlalchemy import create_engine
from sqlalchemy import MetaData
from sqlalchemy import Table
import cx_Oracle

engine = create_engine('oracle+cx_oracle://user:passwd@FTSDBLAB')
meta = MetaData()
meta.reflect(bind=engine)
tbl_mgr_theater = Table('mgr_table', meta, autoload=True, autoload_with=engine)

connection = engine.connect()
result = connection.execute(tbl_mgr_theater.select())

print(result.rowcount())

дает следующую ОШИБКУ:

Traceback (последний вызов был последним): Файл "", строка 1, в TypeError: объект 'int' не вызывается Ошибка закрытия курсора Traceback (последний вызов был последним): AttributeError: у объекта 'cx_Oracle.Cursor' нет атрибута 'lastrowid'

1 Ответ

0 голосов
/ 06 июля 2018

Прежде всего, rowcount является атрибутом , поэтому вы можете использовать его следующим образом:

print(result.rowcount)

Но он вернет 0. Почему ?

Потому что это полезно только в операторе UPDATE или DELETE . Вопреки тому, что говорит DBAPI Python, он не возвращает количество строк, доступных по результатам оператора SELECT , поскольку DBAPI не могут поддерживать эту функцию, когда строки не буферизованы.

Как я могу получить количество строк оператора SELECT ?

Вы можете ВЫБРАТЬ с помощью COUNT следующим образом:

result = connection.execute(tbl_mgr_theater.select().count())

Возвращает ResultProxy. Но если вы хотите получить результат типа int, вы можете сделать:

result=[x for x in connection.execute(tbl_mgr_theater.select().count())][0][0]

Поскольку вы знаете, что это оператор SELECT COUNT (он будет возвращать только одно поле), вы можете установить первое [0] , второе - проанализировать RowProxy в int .

Надеюсь, это поможет вам.

...