Я работаю с объектом Query алхимического ORM.
В другом контексте он возвращает разные типы.
У меня есть следующая таблица в postgres:
select * from test;
test_id | test_col1 | test_col2
---------+-----------+-----------
1 | ABC | ABC
2 | XYZ | XYZ
У меня есть следующий класс в Python3:
class Test (DeclarativeBase):
__tablename__ = 'test'
id = sa.Column('test_id', sa.Integer(), primary_key=True)
col1 = sa.Column('test_col1', sa.String(250), nullable = True)
col2 = sa.Column('test_col2', sa.String(250), nullable = True)
Мои запросы и результаты:
In [2]: q1 = session.query(Test)
In [3]: rows1 = q1.all()
In [4]: print(type(rows1[0]))
<class '__main__.Test'>
In [5]:
In [5]: cte = session.query(Test).cte()
In [6]: q2 = session.query(cte)
In [7]: rows2 = q2.all()
In [8]: print(type(rows2[0]))
<class 'sqlalchemy.util._collections.result'>
In [9]:
In [9]: q3 = session.query(Test).filter(Test.col1 == 'ABC')
In [10]: rows3 = q3.all()
In [11]: print(type(rows3[0]))
<class '__main__.Test'>
In [12]:
In [12]:
In [12]: q4 = session.query(Test).filter(Test.col1 == 'ABC').one()
In [13]: print(type(q4))
<class '__main__.Test'>
In [14]:
In [14]: result = session.execute(session.query(Test).filter(Test.col1 == 'ABC'))
In [15]: for row in result:
...: print (type(row))
...:
<class 'sqlalchemy.engine.result.RowProxy'>
Только тип "sqlalchemy.util._collections.result" позволяет использовать метод _asdict () для строки.
Поэтому, если я вызываю _asdict () в своем коде, я должен явно проверить тип, в противном случае - я получаю исключение 'AttributeError'.
Можно ли вернуть только один тип из запроса ORM алхимии и использовать _asdict () без дополнительных проверок?