Я пытаюсь выполнить запрос на Python с помощью SQLAlchemy, чтобы получить все WLC в таблице, используя этот код:
with create_new_session() as session:
statement = select(Location.wlc)
rows = session.exec(statement).all()
Когда в таблице есть хотя бы одна запись, все работает нормально. Я могу подключиться к базе данных, запросить таблицу и получить записи.
Когда в таблице нет записей, код завершается сбоем.
Под прикрытием SQLAlchemy строит для меня этот запрос:
SELECT "LOCATIONS"."LOCS"."WLC" FROM "LOCATIONS"."LOCS"
Если я использую этот запрос напрямую с текстом
statement = text('SELECT "LOCATIONS"."LOCS"."WLC" FROM "LOCATIONS"."LOCS"')
Или, если я напишу запрос вручную, он тоже будет работать нормально.
statement = text('SELECT LOCS.WLC FROM LOCS')
Но если мне придется писать запросы самому, то мне не нужны ORM и SQLAlchemy.
Исключение, которое возникает:
File "/home/genaro/Documents/worklocations/src/work_locations/jobs/handlers/extract.py", line 240, in _get_db2_wlcs
rows = session.exec(statement).all()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/genaro/Documents/worklocations/venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py", line 1476, in all
return self._allrows()
^^^^^^^^^^^^^^^
File "/home/genaro/Documents/worklocations/venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py", line 401, in _allrows
rows = self._fetchall_impl()
^^^^^^^^^^^^^^^^^^^^^
File "/home/genaro/Documents/worklocations/venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py", line 1389, in _fetchall_impl
return self._real_result._fetchall_impl()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/genaro/Documents/worklocations/venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py", line 1813, in _fetchall_impl
return list(self.iterator)
^^^^^^^^^^^^^^^^^^^
File "/home/genaro/Documents/worklocations/venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py", line 147, in chunks
fetch = cursor._raw_all_rows()
^^^^^^^^^^^^^^^^^^^^^^
File "/home/genaro/Documents/worklocations/venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py", line 393, in _raw_all_rows
return [make_row(row) for row in rows]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: 'NoneType' object is not iterable
Похоже, что руководитель возвращает None вместо пустого списка.
Есть идеи? Что-то я делаю неправильно? Заранее спасибо.
PS: Заполню свой вопрос, чтобы ответить на вопросы ниже:
- Это версии:
Имя: SQLAlchemy
Версия: 1.4.52
Имя: sqlmodel
Версия: 0.0.11
Имя: ibm_db
Версия: 3.2.7
Имя: ibm_db_sa
Версия: 0.4.2 - Это create_new_session(). Но, как я уже сказал, если в таблице есть записи, код работает нормально.
"""Creates new db2 session"""
engine = create_engine(DB_URL)
session = Session(engine)
return session
Подробнее здесь: https://stackoverflow.com/questions/798 ... ble-in-db2
Мобильная версия