2017-04-05 47 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

首先使用dest參數add_argument()分配您的參數變量。可以說我們將輸入分配給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)) 

注意做這個用的execute(' ... %s ...', (args.project_id))我們通過插值引用project_id到字符串值。

+0

我想你想'(args.project_id)',而不是'(PROJECT_ID)'作爲參數傳遞給'execute'聲明。 – shahkalpesh

+0

是的!這確實是我們應該在那裏。 – putonspectacles

+0

感謝您的幫助! – user7822097

0

調用args = parser.parse_args()後,您可以獲取的參數值是這樣的:

pid = args.project_id

然後你就可以使用正常的字符串替換使用的pid該值在你的代碼。但是,最好使用psycopg2的內置方法將參數傳遞給SQL查詢以防止SQL注入。

普通字符串替換:

'hello world {]'.format(var_name) 

psycopg2:

cur.execute('SELECT * from %s', (var_name))