1

Psycopg2を使用して Python で狂った SQL クエリがあります。archesクエリは、テーブルからいくつかの列を読み取ります。

rows = archesDB.read_all("""SELECT "+str(columns)[1:-1].replace("'","")+" 
                           FROM arches 
                           WHERE lower(arch) like '%%%s%%'""" % (arch.lower()))

このクエリをパラメーター化して、必要な列を文字列連結を使用して指定するのではなく、パラメーターとして指定するようにします。これははるかに洗練された方法です。

単純な方法はSELECT *、必要な列を除外することです。しかし、これは不要なデータで DB とネットワークに負担をかけるので、むしろ避けています。

何か案は?

アダム

4

2 に答える 2

2

列名は、DB API 内のパラメーターとして SQL 文字列で渡すことはできません。そして、それも意味がありません。

列名の入力を確認する必要がある場合は、事前にサニタイズしてください。

ただし、like 文字列はパラメーターとして入力する必要があります

次のコード サンプルは、列変数に列名の文字列のリストが含まれている場合に改善されます。

rows = archesDB.read_all("""SELECT %s 
                       FROM arches 
                       WHERE lower(arch) like %%s""" % (",".join(columns),),
                       ("%%%s%%" % (arch.lower(),),))

最初に、最初の置換 (%s) 内に列名が挿入され、最後の %%s が %s に変換されます。次に、 ("%%%s%%" % (arch.lower(),),) は %string_content% で文字列を作成します。そして最後に、db api は %string_content% をエスケープし、それに引用符を追加して、最終的にクエリを作成します。

于 2010-12-09T12:40:56.310 に答える
0

メタデータをパラメータ化することはできません。目的のフィールド リストへの識別子のマッピングを作成し、それを使用します。

于 2010-12-09T10:27:59.613 に答える