sqlalchemy ORM объект запроса возвращает результат различного типа в зависимости от контекста - PullRequest
0 голосов
/ 24 июня 2019

Я работаю с объектом 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 () без дополнительных проверок?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...