2012-02-22 7 views
3

パラメータ:の問題は、私はモデルのカスタム生のクエリを作成しようとしていたと私はこのエラーを取得

DatabaseError: error de sintaxis en o cerca de «E'positions_statusrecord'» LINE 1: SELECT id FROM E'positions_statusrecord' WHERE "type"=E'Leav...

は、ここで(それはマネージャーの方法私が使用しようとしている生のクエリのさ):

def get_status_ids(self, model): 
    """ 
    This query returns the latest statuses ids for each entry 
    of "model" in StatusRecord. 
    """ 
    db_table = self.model._meta.db_table 
    model_type = model.get_status_type() 

    raw_query = (
     "SELECT id " 
     "FROM %s " 
     "WHERE \"type\"=%s AND " 
     "(identifier,date_time) IN " 
       "(" 
          "SELECT identifier, Max(date_time) " 
          "FROM %s " 
          "WHERE \"type\"=%s " 
          "GROUP BY identifier" 
       ")" 
    ) 

    params = (db_table, model_type, db_table, model_type,) 
    return self.raw(raw_query, params) 

私は単純なクエリ(ちょうどSELECT ... FROM ..)を試み、同じ問題を抱えていました。未処理のクエリでは、パラメータを使用してFROM部分を完成させることはできませんでした。

私は正しいですか?私は間違いを犯したのですが、私はそれを見つけられませんか?

私はpostgreSQL 8.4.10、django 1.3、およびPython 2.6を使用しています。

未処理のクエリパラメータに関する情報を検索して、いくつかの禁止されている書式設定オプションがあるかどうかを確認しましたが、何か助けになるものは見つかりませんでした。

誰もがこのエラーの原因を知っていますか?

答えて

2

It seems to be that raw queries couldn't have the "FROM" part completed with a parameter.

はい、ORMは文字列引数を引用して、... FROM 'some_table' ...にします。 DB_Tableのパラメータが信頼されているので

(ユーザー入力から発信されていない)、あなたのような何かを行うことができます:

raw_query = (
    "SELECT id " 
    "FROM %s " 
    "WHERE \"type\"=%%s AND " 
    "(identifier,date_time) IN " 
      "(" 
         "SELECT identifier, Max(date_time) " 
         "FROM %s " 
         "WHERE \"type\"=%%s " 
         "GROUP BY identifier" 
      ")" 
) % (db_table, db_table) 
return self.raw(raw_query, (model_type, model_type)) 

Django Aggregation can be used in filtersので、おそらくあなたは(も見て生のSQLに頼らずに同じ結果を得ることができますin lookup example)。

raw()QuerySet.extra()と置き換えて、INEXISTSと置き換えてください。

+0

ありがとうございます。私は、常に "params"引数で引数を生のクエリに渡すことが推奨されると考えました。私はセキュリティ問題の初心者ですので、私は常にそのように使用しようとしました。しかし、このケースでは信頼できる入力であることは事実です。 「EXISTS」の問題については、これまでに行ったことだと思いますが、別の方法ではパフォーマンスの問題がありました。私が正しければ、そのクエリはテーブル内のすべてのエントリに対してサブクエリを作成し、テーブルには(2000以上の)エントリがたくさんあります。私はこれをやったと思うが、私はもう一度試してみるだろう。どうもありがとうございました! – marianobianchi

+0

@marianobianchi:2000エントリはかなり小さく、 'IN'と' EXISTS'の間に違いは見られません。 –

関連する問題