2017-04-05 11 views
1

呼び出し時に-p引数が必要な次のコードがあります。しかし、SQLクエリで-p引数をどのように呼び出すのですか?また、この-p引数のテキストを出力ファイル名に使用したいと考えています。Pythonコードで引数を呼び出す

#!/usr/bin/python 

import argparse 
import psycopg2 
import csv 

parser = argparse.ArgumentParser(description='insert the project ID as an 
argument') 
parser.add_argument('-p','--project_id', help='project_id to pull files from 
ERAPRO',required=True) 
args = parser.parse_args() 

conn = psycopg2.connect(database="XXX", user="XXX", password="XXX", 
host="XXX", port="5432") 
cur = conn.cursor() 

cur.execute("""SELECT project_analysis.project_accession, 
analysis.analysis_accession, file.filename, file.file_md5, file.file_location 
    FROM project_analysis 
    LEFT JOIN analysis on project_analysis.analysis_accession = analysis.analysis_accession 
    LEFT JOIN analysis_file on analysis.analysis_accession = analysis_file.analysis_accession 
    LEFT JOIN file on analysis_file.file_id = file.file_id 
    WHERE project_accession = <INSERT -p ARGUMENT HERE> and analysis.hidden_in_eva = '0';""") 

records = cur.fetchall() 

with open ('/nfs/production3/eva/user/gary/evapro_ftp/<INSERT -p ARGUMENT 
HERE>.csv', 'w') as f: 
writer = csv.writer (f, delimiter = ',') 
for row in records: 
    writer.writerow(row) 

conn.close() 

おかげ

答えて

2

まずadd_argument()dest引数を使用して、変数へのあなたの引数を割り当てます。入力をproject_id変数に代入するとします。 このようにして、コード内で参照できます。

parser.add_argument('-p','--project_id', 
        help='project_id to pull files from 
        ERAPRO', 
        required=True, 
        dest='project_id') # notice the dest argument 

cur.execute("""SELECT project_analysis.project_accession, 
analysis.analysis_accession, file.filename, file.file_md5, file.file_location 
    FROM project_analysis 
    LEFT JOIN analysis on project_analysis.analysis_accession = analysis.analysis_accession 
    LEFT JOIN analysis_file on analysis.analysis_accession = analysis_file.analysis_accession 
    LEFT JOIN file on analysis_file.file_id = file.file_id 
    WHERE project_accession = %s and analysis.hidden_in_eva = '0';""", (args.project_id)) 

は、私たちが文字列にproject_idによって参照値を補間し、これを行うことにより、execute(' ... %s ...', (args.project_id))の使用を注意してください。

+0

私はあなたが望んでいたと仮定し、 '(args.project_id)'の代わりに '(PROJECT_ID)の' 'execute'声明へのパラメータとして。 – shahkalpesh

+0

はい!それは確かに私たちがそこに持つべきものです。 – putonspectacles

+0

ご協力いただきありがとうございます! – user7822097

0

args = parser.parse_args()を呼び出した後、あなたは次のように引数の値を取得できます。

pid = args.project_id

は、その後、あなたが通常の文字列置換を使用して、コード内でpidのその値を使用することができます。しかし、SQL注入を防ぐためにSQLクエリにパラメータを渡すためには、psycopg2の組み込みメソッドを使用する方がよいでしょう。

通常の文字列置換:

'hello world {]'.format(var_name) 

psycopg2:

cur.execute('SELECT * from %s', (var_name)) 
関連する問題