2016-05-04 16 views
0

Ich versuche, eine Funktion in Python zu schreiben, die eine SQL-Abfrage an die Datenbank sendet, die abgerufenen Daten in einem Python-Dataframe speichert und für eine Anzahl von in Excel auf einer benannten Registerkarte ausgibt Abfragen. Ich habe es funktioniert, wenn die Namen für die "Verknüpfung" zuvor manuell ausgeführt wurden, aber ich kann nicht neue "Verknüpfung" Namen in jeder Instanz des Funktionsaufrufs schreiben.NameError: Name ist nicht definiert Funktion

Kann mir bitte jemand helfen, dieses Problem zu debuggen?

Hier ist der Python-Code:

import cx_Oracle 
import pandas as pd 
import xlwt as xls_write 

writer = pd.ExcelWriter('<Excel File>') 

def executeSQL(shortcut, tab, SQL): 
    conn = cx_Oracle.connect('<Connection String') 
    cursor= conn.cursor() 
    cursor.execute (SQL) 
    shortcut = pd.DataFrame(cursor.fetchall()) 
    shortcut.columns = [rec[0] for rec in cursor.description] 
    cursor.close() 
    conn.close() 
    shortcut.to_excel(writer, tab, index=False) 

executeSQL(tab1, 'Tab 1', "<SQL Statement>") 
executeSQL(tab2, 'Tab 2', "<SQL Statement>") 
executeSQL(tab3, 'Tab 3', "<SQL Statement>") 
executeSQL(tab4, 'Tab 4', "<SQL Statement>") 
executeSQL(tab5, 'Tab 5', "<SQL Statement>") 
+0

Es gibt keine Variable mit dem Namen ist 'name', während der Fehler sich selbst ist Ich glaube nicht, dass der Fehler in diesem Code-Snippet liegt, das Sie oben gepostet haben. –

Antwort

0

Warum sind Sie die Verknüpfung Parameter übergeben, und definieren sie dann wieder in der Funktion? Ich verbinde typischerweise Pyodbc verwenden, da ich nicht Ihre aktuellen Daten haben, ist hier ein Mock-up, wie ich dies tun würde:

import cx_Oracle 
import pandas as pd 
import xlwt as xls_write 

writer = pd.ExcelWriter('<Excel File>') 
conn = cx_Oracle.connect('<Connection String') 

def executeSQL(tab, SQL, connection): 

    df = pd.read_sql(SQL,connection) 
    df.to_excel(writer, tab, index=False) 

executeSQL('Tab 1', "<SQL Statement>") 
executeSQL('Tab 2', "<SQL Statement>") 
executeSQL('Tab 3', "<SQL Statement>") 
executeSQL('Tab 4', "<SQL Statement>") 
executeSQL('Tab 5', "<SQL Statement>") 

conn.close() 
+0

Vielen Dank - Ich füge eine Zeile hinzu, um den Datenrahmen in der Funktion zu löschen, und es funktioniert jetzt gut; Danke für den Tipp! – NYCTed

Verwandte Themen