【问题标题】:pyodbc the sql contains 0 parameter markers but 1 parameters were supplied' 'hy000'pyodbc sql 包含 0 个参数标记,但提供了 1 个参数''hy000'
【发布时间】:2017-09-15 10:14:11
【问题描述】:

我正在使用 Python 3.6、pyodbc,并连接到 SQL Server。

我正在尝试连接到数据库,然后使用参数创建查询。

代码如下:

import sys
import pyodbc

# connection parameters
nHost = 'host'
nBase = 'base'
nUser = 'user'
nPasw = 'pass'

# make connection start
def sqlconnect(nHost,nBase,nUser,nPasw):
    try:
        return pyodbc.connect('DRIVER={SQL Server};SERVER='+nHost+';DATABASE='+nBase+';UID='+nUser+';PWD='+nPasw)
        print("connection successfull")
    except:
        print ("connection failed check authorization parameters")  
con = sqlconnect(nHost,nBase,nUser,nPasw)
cursor = con.cursor()
# make connection stop

# if run WITHOUT parameters THEN everything is OK   
ask = input ('Go WITHOUT parameters y/n ?')
if ask == 'y':
    # SQL without parameters start
    res = cursor.execute('''
    SELECT * FROM TABLE 
    WHERE TABLE.TIMESTAMP BETWEEN '2017-03-01T00:00:00.000' AND '2017-03-01T01:00:00.000'
    ''')
    # SQL without parameters stop

    # print result to console start
    row = res.fetchone()
    while row:
        print (row)
        row = res.fetchone()
    # print result to console stop

# if run WITH parameters THEN ERROR
ask = input ('Go WITH parameters y/n ?') 
if ask == 'y':

    # parameters start
    STARTDATE = "'2017-03-01T00:00:00.000'"
    ENDDATE = "'2017-03-01T01:00:00.000'"
    # parameters end

    # SQL with parameters start
    res = cursor.execute('''
    SELECT * FROM TABLE 
    WHERE TABLE.TIMESTAMP BETWEEN :STARTDATE AND :ENDDATE
    ''', {"STARTDATE": STARTDATE, "ENDDATE": ENDDATE})
    # SQL with parameters stop

    # print result to console start
    row = res.fetchone()
    while row:
        print (row)
        row = res.fetchone()
    # print result to console stop

当我在 SQL 中运行不带参数的程序时,它可以工作。

当我尝试使用参数运行它时,发生了错误。

【问题讨论】:

标签: python sql pyodbc markers


【解决方案1】:

如果您像我一样尝试使用pd.to_sql(),我通过传递一个名为 chunksize 的参数解决了这个问题。

df.to_sql("tableName", engine ,if_exists='append', chunksize=50)

希望对你有帮助

【讨论】:

    【解决方案2】:

    我遇到了类似的问题。看到将 PyODBC 的版本降级到 4.0.6 和 SQLAlchemy 到 1.2.9 修复了错误,使用 Python 3.6

    【讨论】:

      【解决方案3】:

      我尝试了很多不同的错误:42000、22007、07002 和其他

      工作版本如下:

      import sys
      import pyodbc
      import datetime
      
      # connection parameters
      nHost = 'host'
      nBase = 'DBname'
      nUser = 'user'
      nPasw = 'pass'
      
      # make connection start
      def sqlconnect(nHost,nBase,nUser,nPasw):
          try:
              return pyodbc.connect('DRIVER={SQL Server};SERVER='+nHost+';DATABASE='+nBase+';UID='+nUser+';PWD='+nPasw)
          except:
              print ("connection failed check authorization parameters")  
      con = sqlconnect(nHost,nBase,nUser,nPasw)
      cursor = con.cursor()
      # make connection stop
      
      STARTDATE = '11/2/2017'
      ENDDATE = '12/2/2017'
      params = (STARTDATE, ENDDATE)
      
      # SQL with parameters start
      sql = ('''
      SELECT * FROM TABLE 
      WHERE TABLE.TIMESTAMP BETWEEN CAST(? as datetime) AND CAST(? as datetime)
      ''')
      # SQL with parameters stop
      
      # print result to console start
      query = cursor.execute(sql, params)
      row = query.fetchone()
      while row:
          print (row)
          row = query.fetchone()
      # print result to console stop  
      say = input ('everething is ok, you can close console')
      

      【讨论】:

        【解决方案4】:

        通过 ODBC 的 SQL 语句中的参数是位置参数,并由 ? 标记。因此:

        # SQL with parameters start
        res = cursor.execute('''
        SELECT * FROM TABLE 
        WHERE TABLE.TIMESTAMP BETWEEN ? AND ?
        ''', STARTDATE, ENDDATE)
        # SQL with parameters stop
        

        另外,最好避免将日期作为字符串传递。让 pyodbc 使用 Python 的日期时间来处理:

        from datetime import datetime
        ...
        STARTDATE = datetime(year=2017, month=3, day=1)
        ENDDATE = datetime(year=2017, month=3, day=1, hour=0, minute=0, second=1)
        

        然后只传递上面的参数。如果您更喜欢字符串解析,请参阅this answer

        【讨论】:

        • 谢谢!我认为这是正确的方法,但我有下一个错误: pyodbc .DataError:
        • 这是一个无效的日期时间格式错误(请参阅docs.microsoft.com/en-us/sql/odbc/reference/appendixes/…)。我以为这可能会发生。您应该尝试像这样使用datetimefrom datetime import datetime ... STARTDATE = datetime(year=2017, month=1, ...)
        • 非常感谢!我现在就试试!
        猜你喜欢
        • 1970-01-01
        • 2018-10-17
        • 1970-01-01
        • 1970-01-01
        • 2012-03-25
        • 1970-01-01
        • 2018-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多