Python 到 SQL Server 存储过程

3
我是一个有用的助手,可以为您翻译文本。
我正在尝试使用 sqlalchemy 从 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 Server版本是不可更改的。我对SQLAlchemy没有强烈的忠诚度,并且可以接受其他建议。

如果需要,可以提供更多信息。希望能够得到任何建议。


我使用sqlalchemy的text()对象解决了这个问题。作为一个新手,我被禁止在7小时内回答自己的问题。一旦时间过期,我会发布完整的解决方案。 - GinjaNinja
1个回答

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()

希望这对其他人有所帮助!

1
SQLalchemy的文档中并不是很清楚,但DB.execute(t)是不安全的。您应该在SQL中使用绑定变量,并将字典作为execute()的第二个参数。 - Cees Timmerman
2
或者更简洁的代码:engine.execute("insert into users values (?, ?)", 1, "john")。原因是为了避免像 ' 这样的危险字符对你的值造成影响。 - Cees Timmerman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接