代码之家  ›  专栏  ›  技术社区  ›  xtian

如何在pyODBC查询中参数化日期戳?

  •  1
  • xtian  · 技术社区  · 6 年前

    我在用 pyodbc 一起 QODBC 构造ODBC查询。

    插入日期戳参数时遇到问题在这里,您可以看到从文本版本(1)到字符串格式版本(2)到错误状态版本的升级( 注意 DateFrom &安培; DateTo ):

    1. sql = "sp_report ProfitAndLossStandard show Amount_Title, Text, Label, Amount parameters DateFrom = {d'2018-02-12'}, DateTo = {d'2018-02-18'}, SummarizeColumnsBy='TotalOnly', ReturnRows='All'"

    2. sql = "sp_report ProfitAndLossStandard show Amount_Title, Text, Label, Amount parameters DateFrom = %s, DateTo = %s, SummarizeColumnsBy='TotalOnly', ReturnRows='All'" % (q_startdate, q_enddate)

    插入语法的后续尝试 ? , cursor.execute(sql, (q_startdate), (q_enddate)) 以及变量:

    q_startdate = ("{d'%s'}" % dates[0])
    q_enddate = ("{d'%s'}" % dates[1])
    
    1. sql = "sp_report ProfitAndLossStandard show Amount_Title, Text, Label, Amount parameters DateFrom = ?, DateTo = ?, SummarizeColumnsBy='TotalOnly', ReturnRows='All'"

    >>> ('HY004', '[HY004] [Microsoft][ODBC Driver Manager] SQL data type out of range (0) (SQLBindParameter)')

    q_startdate = (dates[0])
    q_enddate = (dates[1])
    
    1. sql = "sp_report ProfitAndLossStandard show Amount_Title, Text, Label, Amount parameters DateFrom = {d'?'}, DateTo = {d'?'}, SummarizeColumnsBy='TotalOnly', ReturnRows='All'"

    >>> ('42000', "[42000] [QODBC] [sql syntax error] Expected lexical element not found: = {d'?'} (11015) (SQLPrepare)")

    阅读 pyodbc公司 Wiki page on inserting data ,我没有读到任何关于插入字符串的减速这一定与pyodbc如何处理(转义)日期戳有关。

    如何参数化日期戳——特别是 qodbc flavor of datestamp .

    1 回复  |  直到 6 年前
        1
  •  1
  •   Gord Thompson    6 年前

    几乎没有必要像这样使用ODBC转义序列 {d'2018-02-12'} 在pyodbc参数化查询中如果参数值是真的Python date 对象

    q_startdate = date(2018, 2, 12)
    

    然后pyodbc将通知ODBC驱动程序参数值是 SQL_TYPE_DATE 如ODBC跟踪日志所示

    [ODBC][2984][1532535987.825823][SQLBindParameter.c][217]
            Entry:
                Statement = 0x1f1a6b0
                Param Number = 1
                Param Type = 1
                C Type = 91 SQL_C_TYPE_DATE
                SQL Type = 91 SQL_TYPE_DATE
                Col Def = 10
                Scale = 0
                Rgb Value = 0x1f3ac78
                Value Max = 0
                StrLen Or Ind = 0x1f3ac58
    

    我们可以在SQL命令文本中使用一个空参数占位符

    ... parameters DateFrom = ?, ...