2016-09-20 25 views
0

私は同時にpythonとsqlを学んでいます。 ;)次のpythonスクリプトはSQLスクリプトを呼び出します。私はcsvに行くためにクエリからの出力を取得する方法を把握しようとしています。私はここまで得ている:ファイルにSQLスクリプトを呼び出すpythonスクリプトの出力を書き込む


#!/usr/bin/env python 
import cx_Oracle 
import sys 
import csv 
import os.path 
import subprocess 
con = cx_Oracle.connect('creden/[email protected](DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(Host =server.work.net)(Port = 3453)))(CONNECT_DATA = (SID = SQLTEST)))') 
cur=con.cursor() 

f=open('/usr/local/src/sql/script_01.sql') 
    full_sql=f.read() 
    sql_commands=full_sql.split(";") 
for sql_command in sql_commands: 
    cur.execute(sql_command) 

# Here is where the magic should happen 
# The output of above should go to the 'test_query' file 
query_results = <OUTPUT OF FOR LOOP> 

c=csv.writer(open("/home/user/sqlplus/test_query/test_query.csv","w"),delimiter=";",lineterminator="\r\n") 
c.writerows(query_results) 

cur.close() 

は、誰かが私には欠けているものを私に教えてくださいことはできますか?

+0

Oracle DBにアクセスできないため、何が問題になるかはわかりません。 – Jeon

+0

sqlスクリプトはうまく動作していますが、私はcsvにcur.execute(sql_command)を返す方法を理解できません。 – Secher

+0

何かを実行するたびに結果を取得する必要があります。だから、 'results = cur.fetchall()'と 'query_results.append(results)'のようなものをforループに追加することができます。 –

答えて

0

これはあなたを助けるでしょう。 Documentation

クエリ結果のすべての行をフェッチする関数fetchall()があります。

あなたはタイプタプルのものであろう

cur.execute("sql_command") 
query_result = cur.fetchall() 

query_resultとして使用することができます。

これには、一度に1つのコマンドの結果しか含まれません。

これでリストを使用できます。すべての結果を追加します。

results = [] 
for sql_command in sql_commands: 
    cur.execute(sql_command) #sql_command is of type string 
    query_result = cur.fetchall() 
    print(query_result) 
    #query_result will be tuple so select which part of the tuple you need. e.g query_result[0], query_result[1] etc. 
    results.append(query_result[0]) #change index according to your need 

forループの最後に、クエリのすべての出力を持つリスト(結果)が表示されます。

別のforループ(結果リスト)を使用すると、各クエリの結果を1つずつ で取得し、csvファイルに書き込むことができます。

私は今csvファイルをどのように扱うべきではありません。おそらく、各反復でcsvファイルを保存する必要があります。 これを処理できることを願っています。

関連する問題