2016-08-18 3 views
0

いくつかの注意点:古典的なマッピングを使用している場合、どのようにsqlalchemyのクエリにカスタム列を追加しますか?

    (私たちは最終的になります)
  1. は、上記の私たちのモデルはYAMLファイルから生成されている、と我々はこの時点でYAMLファイルを経由して計算されたプロパティを追加する方法を持っていない
  2. ハイブリッドプロパティを追加するモデルはありません。

それが返されるオブジェクトに含まれていることなどはなく、返されたタプルの個別のエントリとして、クエリに計算列を追加するための適切な方法は何ですか?

db_query = session.query(Listing) 
db_query = db_query.add_column("1 as listing_test") 

print(self.db_query) 
## this looks good. 
# SELECT listing.id AS listing_id, 1 as listing_test 
# FROM listing 
# WHERE listing.id = :id_1 

self.db_query.all() 
## this looks bad. 
# [(<flask_sqlalchemy.Lease object at 0x7fca868ff1d0>, 1)] 

self.db_query.column_descriptions 
[{'aliased': False, 
    'entity': <class 'flask_sqlalchemy.Lease'>, 
 'expr': <class 'flask_sqlalchemy.Lease'>, 
 'name': 'Lease', 
 'type': <class 'flask_sqlalchemy.Lease'>}, 
{'aliased': False, 
 'entity': None, 
 'expr': '1 as listing_test', 
 'name': '1 as listing_test', 
 'type': NullType()}] 

理想的には、現在返されているタプルの代わりに、listing_testは返されたリストオブジェクトの一部に過ぎません。

+0

私がテストしたかこれを行っていますが、[反射]を使用してこれを達成することができるかもしれないしていません(http://docs.sqlalchemy.org/en/latest/core/reflection.html#overriding-反映された列)。 –

+0

クラスの生成後にクラスやプロパティを追加することができます(つまり、 'List.listing_test = Column(...)')。私はあなたがクラスにマッパーが設定される前にそれを行う必要があるかどうかは不明です。 – univerio

答えて

0

@univerio非常に近いです!

私はそれを列プロパティとして設定しなければならず、その後はすべて正常でした。

class Listing(db.model): 
    custom_function = column_property(func.custom_function(id)) 
関連する問題