2017-11-02 14 views
0

データベースのバックエンドからraw SQLクエリを実行して情報を取得しようとしています。私は計算を行う必要があります(係数をフィールドに掛けて切り捨て)、それを演奏の方法でJSONに変換する必要があります。それが私がここで(Django)ORMを使用しないことを決めた理由です。私はpython構文に使用されませんので、このような文を作成するためのエレガントな解決策があるかどうか、まだ私は疑問に思ってPython Django与えられたリストからRaw SQLクエリを作成する

[ 
    {'column': 'column1', 'factor': 100, 'description': 'COL1', 'trunc': 2}, 
    {'column': 'column2', 'factor': 100, 'description': 'COL2', 'trunc': 2}, 
    [..] 
] 

with connection.cursor() as cursor: 
    cursor.execute(
     ''' 
     SELECT json_build_object(
     'data', array_agg(r) 
    ) 
     FROM (
     SELECT 
      time, 
      trunc(column1 * 100, 2) as COL1, 
      trunc(column2 * 100, 2) as COL2, 
      [...] 
     FROM measurements 
      WHERE device_id=%s 
      ORDER BY time DESC 
      LIMIT 5 
    ) r 
     ''', 
     [device_id] 
) 
    result = cursor.fetchall() 

は、私は以下のリストから上記のステートメントを適応させる必要があります。私はちょうどdictsのリストをループし、クエリを追加することができますが、それは私には良い/右を感じていない知っている。任意の提案をいただければ幸いです。

私はこのような何かを考えています:

['trunc({} * {}, {}) as {}'.format(
    d['column'], d['factor'], d['trunc'], d['description']) for d in l 
] 

答えて

1

あなたはpsycopg 2.7を使用している場合、あなたは意志2.6およびそれ以前のバージョンでは、安全な

from psycopg2 import sql 

query = sql.SQL(''' 
    SELECT json_build_object(
    'data', array_agg(r) 
) 
    FROM (
    SELECT time, {} 
    FROM measurements 
     WHERE device_id=%s 
     ORDER BY time DESC 
     LIMIT 5 
) r 
''') 

truncated_rows = sql.SQL(', ').join(
    sql.SQL('trunc({} * {}, {}) as {}').format(
     sql.Identifier(d['column']), 
     sql.Literal(d['factor']), 
     sql.Literal(d['trunc']), 
     sql.Identifier(d['description']) 
    ) 
    for d in l 
) 

with connection.cursor() as cursor: 
    cursor.execute(query.format(truncated_rows), [device_id]) 

すべてを行いますされ、SQLモジュールを使用することができますPython文字列形式に戻す必要があります

','.join(
    'trunc({column} * {factor}, {trunc}) as {description}'.format(**data) 
    for data in 
    [ 
     {'column': 'column1', 'factor': 100, 'description': 'COL1', 'trunc': 2}, 
     {'column': 'column2', 'factor': 100, 'description': 'COL2', 'trunc': 2}, 
    ] 
) 
関連する問題