0

モデルの履歴データが必要なので、simple_history を使用しています。pool_historicalpo_staff という「歴史的」モデルを持つ po_staff というモデルがあります。ここで、pool_historicalpo_staff に基づいて、各従業員の最後のレコードを含むクエリセットを取得したいと考えています (実際のクエリははるかに複雑であるため、できるだけ単純にしようとしました)。私は現在SQLLiteに取り組んでいます

履歴モデルには、次のデータが含まれています。

ID staff_nr valid      staff_firstname staff_lastname
1  111      01/01/2014 Firstname1      Lastname1
2  3        01/01/2014 Firstname2      Lastname2
2  3        01/04/2014 Firstname2      Lastname2_new #Employee has changed his Lastname

このコードは正常に動作します (アルファベット順):

qs = po_staff.history.raw ('SELECT * FROM pool_historicalpo_staff '
     'WHERE clientID_id is %s and companyID_id is %s '
     'GROUP BY id '
     'ORDER BY staff_name, staff_surname ',
     [client_id, company_id])

staff_nr はユーザーから変更できるため、グループ化には「id」を使用する必要があります (ただし、従業員は同じままです)。

問題 1: ユーザーは、alpabetical と staff_id の間で結果の順序を選択できます

これを可能にするために、クエリに 3 番目の引数を追加しました。

if order == 1:
    order_by = "staff_name, staff_surname"
else:
    order_by = "staff_nr"
qs = po_staff.history.raw ('SELECT * FROM pool_historicalpo_staff '
     'WHERE clientID_id is %s and companyID_id is %s '
     'GROUP BY id '
     'ORDER BY %s ',
     [client_id, company_id, order_by])

クエリは機能しますが、アルファベット順ではなく「id」順に並べられます。

問題 2: 他のモデルに対してもクエリを実行する必要があります。モデルと order_by だけが異なります。すべてのモデルに対してほぼ同じクエリを記述したくないため、より柔軟にしようとしました。

model      = ....  # instance of current model
order_by   = ....  # gets the choosen order for current model, p.e. "staff_name, staff_surname"
model_name = ....  # gets the model name, p.e. "pool_historicalpo_staff"

qs = model.history.raw ('SELECT * FROM %s '
     'WHERE clientID_id is %s and companyID_id is %s '
     'GROUP BY id '
     'ORDER BY %s ',
     [model_name, client_id, company_id, order_by])

このクエリを実行するとエラーが発生します。

Request Method:     GET
Request URL:    http://127.0.0.1:8000/framework/21/?view=kanban
Django Version:     1.7
Exception Type:     OperationalError
Exception Value:    near "?": syntax error
Exception Location:     c:\python34\lib\site-packages\django\db\backends\sqlite3\base.py in     
                        execute, line 485
Python Executable:  c:\python34\python.EXE
Python Version:     3.4.0

すべてを明確に説明したことを願っています。私はdjangoが初めてで、それが私の最初の生のSQLです

助けてくれてどうもありがとう!

4

1 に答える 1

0

これは Django に似ているようです: パラメータを生の SQL クエリに渡すときに MySQL 構文エラーが発生しました

簡単な答え: パラメータのみをクエリに渡すことができます。テーブル名などの SQL 構文の置換部分をサポートするには、クエリを 2 つのパスで作成し、2 番目のパスで実際のパラメーターのみをクエリに渡す必要があります。

お役に立てれば。

于 2015-01-11T13:29:11.000 に答える