1

Python スクリプトから実行しているクエリがあります。次のようになります。

app_phone=str(5555555555)
query_string=""""select biz_name, biz_addr, biz_owner
from business_t
where regexp_replace(biz_phone_1, E'\\\\D|^1', '', 'g') = '"""+app_phone+"""'
or regexp_replace(biz_phone_2, E'\\\\D|^1', '', 'g') = '"""+app_phone+"""'
or regexp_replace(biz_cell_1, E'\\\\D|^1', '', 'g') = '"""+app_phone+"""'
or regexp_replace(biz_cell_2, E'\\\\D|^1', '', 'g') = '"""+app_phone+"""'
;"""
result=run_query(query_string)

クエリは正常に実行されます。ここでの私の質問は、スクリプトに不要な処理を追加しない読みやすい形式で、このタイプのクエリを「文法的に」記述するための最良の方法は何ですか? それともこんな書き方でいいの?

これはちょっと醜いように見えますが、コードで生の SQL を必要とすることの呪いかもしれません。

4

5 に答える 5

1

私はそれを次のようにします:

app_phone = 5555555555
query_string = r"""
    SELECT biz_name, biz_addr, biz_owner
    FROM   business_t
    WHERE  regexp_replace(biz_phone_1, E'\\D|^1', '', 'g') = '{0}'
        OR regexp_replace(biz_phone_2, E'\\D|^1', '', 'g') = '{0}'
        OR regexp_replace(biz_cell_1,  E'\\D|^1', '', 'g') = '{0}'
        OR regexp_replace(biz_cell_2,  E'\\D|^1', '', 'g') = '{0}'
    ;""".format(app_phone)
result = run_query(query_string)

r1 レベルのバックスラッシュ エスケープを取り除くために、プレフィックスを付けた生の文字列にしたことに注意してください。この機能を使用すること.format()は、特に同じ置換値を複数回繰り返したい場合に、Python で文字列置換を行うための全体的な最良の方法 (そして連結よりも確実に優れている) だと思います。数字の代わりに意味のある名前を使用する (つまり{0}、名前に置き換える) べきだと主張する人もいるかもしれませんが、それは問題ありません。また、Python の文字列置換の代わりに SQL のパラメーターを使用する必要があると主張する人もいるかもしれませんが、それは良いアドバイスだと思います。しかし、主に長い文字列、特に連結を管理する方法に焦点を当てているように見えたので、私の答えは Python の文字列機能の使用に焦点を当てています。

于 2013-09-26T21:37:48.920 に答える
0

私は通常、SQL を並べて SQL 用語に大文字を使用することで、生のクエリ文字列をクリーンアップします。

app_phone = 5555555555
query_string = """SELECT biz_name, biz_addr, biz_owner
                  FROM   business_t
                  WHERE  regexp_replace(biz_phone_1, E'\\\\D|^1', '', 'g') = '"""+app_phone+"""'
                  OR     regexp_replace(biz_phone_2, E'\\\\D|^1', '', 'g') = '"""+app_phone+"""'
                  OR     regexp_replace(biz_cell_1, E'\\\\D|^1', '', 'g')  = '"""+app_phone+"""'
                  OR     regexp_replace(biz_cell_2, E'\\\\D|^1', '', 'g')  = '"""+app_phone+"""'
                  ;"""
result = run_query(query_string)
于 2013-09-26T17:48:28.483 に答える