2012-09-18 40 views
3

我想從我的Python代碼中使用sqlalchemy調用SQL Server存儲過程。我發現,python代碼沒有提出任何錯誤,並且存儲過程沒有執行。Python到SQL Server存儲過程

示例代碼:

def SaveData(self, aScrapeResult): 
    sql = "EXECUTE mc.SaveFundamentalDataCSV @pSource='%s',@pCountry='%s',@pOperator='%s',@pFromCountry='%s',@pFromOperator='%s',@pToCountry='%s',@pToOperator='%s',@pSiteName='%s',@pFactor='%s',@pGranularity='%s',@pDescription='%s',@pDataType='%s',@pTechnology = '%s',@pcsvData='%s'" 

    # Need to convert the data into CSV 
    util = ListToCsvUtil() 
    csvValues = util.ListToCsv(aScrapeResult.DataPoints) 

    formattedSQL = sql % (aScrapeResult.Source ,aScrapeResult.Country,aScrapeResult.Operator ,aScrapeResult.FromCountry ,aScrapeResult.FromOperator ,aScrapeResult.ToCountry ,aScrapeResult.ToOperator ,aScrapeResult.SiteName ,aScrapeResult.Factor ,aScrapeResult.Granularity ,aScrapeResult.Description ,aScrapeResult.DataType ,aScrapeResult.Technology ,csvValues) 

    DB = create_engine(self.ConnectionString) 
    DB.connect() 

    result_proxy = DB.execute(formattedSQL) 

    results = result_proxy.fetchall() 

考試格式化SQL的產生以下命令

EXECUTE mc.SaveFundamentalDataCSV @pSource='PythonTest', @pCountry='UK', 
    @pOperator='Operator', @pFromCountry='None', @pFromOperator='None', 
    @pToCountry='None', @pToOperator='None', @pSiteName='None', @pFactor='Factor', 
    @pGranularity='Hourly', @pDescription='Testing from python', 
    @pDataType='Forecast',@pTechnology = 'Electricity', 
    @pcsvData='01-Jan-2012 00:00:00,01-Feb-2012 00:15:00,1,01-Jan-2012 00:00:00,01-Feb-2012 00:30:00,2'; 

的各種版本和使用的軟件如下: SQL Server 2008 R2的 的Python 2.6.6 SQLAlchemy 0.6.7

我測試了我的存儲過程,通過調用它直接在SQL Server Management Studio中使用相同的參數並沒有問題。

值得指出的是,Python版本和SQL服務器版本是不可更改的。我對sqlalchemy沒有強烈的忠誠,並願意接受其他建議。

任何意見將不勝感激,更多的信息可以提供,如果需要的話。

+0

我已經使用sqlalchemy的text()對象修復了這個問題。作爲一個noob,我被禁止回答我自己的問題7個小時。一旦該時間到期,將發佈完整的解決方案。 – GinjaNinja

回答

2

現在修正了,但如果我在這裏使用最佳實踐,可以開放意見。我已經使用了由sqlalchemy公開的'text'對象,工作代碼如下:

def SaveData(self, aScrapeResult): 
    sql = "EXECUTE mc.SaveFundamentalDataCSV @pSource='%s',@pCountry='%s',@pOperator='%s',@pFromCountry='%s',@pFromOperator='%s',@pToCountry='%s',@pToOperator='%s',@pSiteName='%s',@pFactor='%s',@pGranularity='%s',@pDescription='%s',@pDataType='%s',@pTechnology = '%s',@pcsvData='%s'" 

    # Need to convert the data into CSV 
    util = ListToCsvUtil() 
    csvValues = util.ListToCsv(aScrapeResult.DataPoints) 

    formattedSQL = sql % (aScrapeResult.Source ,aScrapeResult.Country,aScrapeResult.Operator ,aScrapeResult.FromCountry ,aScrapeResult.FromOperator ,aScrapeResult.ToCountry ,aScrapeResult.ToOperator ,aScrapeResult.SiteName ,aScrapeResult.Factor ,aScrapeResult.Granularity ,aScrapeResult.Description ,aScrapeResult.DataType ,aScrapeResult.Technology ,csvValues) 

    DB = create_engine(self.ConnectionString) 
    conn = DB.connect() 

    t = text(formattedSQL).execution_options(autocommit=True) 

    DB.execute(t) 

    conn.close() 

希望這對其他人有幫助!

+0

這在SQLalchemy的文檔中並不是很清楚,但是DB.execute(t)是不安全的。你應該在SQL和一個字典中使用綁定變量作爲執行()的第二個參數。 –

+1

或使用較少的代碼:'engine.execute(「insert into users values(?,?)」,1,「john」)'。原因是從你的價值觀中逃脫危險角色,如'''。 –