2016-10-11 7 views
0
Iとのparamsでクエリを実行しようとするクエリを作成するために、私のコードは次のよう

ジャンゴ

def findElem(request, **kwargs): 
    projects_name = str(kwargs['project_name']).split(',') 
    status = str(kwargs['status']) 
    list_project = tuple(projects_name) 
    print(list_project) 
    query = "SELECT * FROM proj_cpus WHERE project in '%s'" % projects_name 
    print(query) 
    result = run_query(query) 
ある

http://127.0.0.1:8000/api/cpuProjects/cpp/es 
http://127.0.0.1:8000/api/cpuProjects/cpp,ad/es 

のようなURLがある私の場合にはURLを通過

こんにちはみんなでクエリを作成します。

最初の復帰このクエリ

SELECT * FROM proj_cpus WHERE project in '['cpp']' 

秒1は、この

ようなクエリによって持っています私は、構文にエラーが発生している問合せの戻りを実行する。この場合
SELECT * FROM proj_cpus WHERE project in '['cpp', 'ad']' 

、はい、私は[]だから私は、クエリので、今のタプル で私のparamsを変換なし正しい

ではありません知っていますその

のようなもので、エラーが

SELECT * FROM proj_cpus WHERE project in ('cpp') 
SELECT * FROM proj_cpus WHERE project in ('cpp', 'ad') 

not all arguments converted during string formatting 

クエリを作成するための最良の方法は何ですか?ですか

事前に感謝

+0

Djangoは非常に効率的で組み込みのORMシステムを持っているので、ORMを使用することを強く要求します。これは危険です。 –

答えて

1

行うための最善のことは、使用することですあなたがチェックすることができ、Djangoの生のクエリの詳細な質問については

from foo.models import CPUSModel 

projects_name = ... whatever you did to get a tuple ... 

results = CPUSModel.objects.raw('SELECT * FROM proj_cpus WHERE project in %s', [tuple(projects_name),]) 
list(results) 

:あなたは正しいあなたの引数をエスケープするためにDjangoはそうしないと、SQLインジェクションの可能性を取得し、世話をしますクエリを作成するDjangoのORM API:

from foo.models import ProjCpu 
... 
projects_name = ... 
... 
ProjCpu.objects.filter(project__in=projects_name) 

Djangoのドキュメントですべての情報を読むことができます。

基本的には知っておく必要がありますが、そのエラーについて詳しく知りたい場合は、読んでおいてください。

エラーは、文字列書式の間違った使用が原因です。 がそうように、あなたはタプルを使用する書式文字列に複数の引数を渡すには:

print("the %s, the %s and the %s" % ("good", "bad", "ugly")) 

、文字列の書式にタプルを供給するので、Pythonは別個の、複数の引数としてタプル内の項目をフォーマットすることを試みました。また、文字列に1つの "%s"しか指定しなかったため、エラーが発生しました。

あなたは別の組の唯一のメンバーとしてそれを置く必要があります唯一の引数としてタプルを供給するために:query = "SELECT * FROM proj_cpus WHERE project in '%s'" % (projects_name,)をやってあなたのケースでは

print("tuple: {}".format(my_tuple)) 

my_tuple = (1, 2, 3) 
print("tuple: %s" % (my_tuple,)) 

またはちょうど.formatを使用もはやエラーを発生させません。しかし、前述のように、DjangoのORMをクエリに使用するだけです。

+0

ご質問ありがとうございます@yonizxz私のケースでは、DjangoのORMをクエリに使用する方法はわかりませんが、テンプレートにデータを表示するためにEXTERNデータベースを参照しますが、このデータを自分で保存する必要はありませんデータベース – Stone