pyodbc el sql contiene 0 marcadores de parámetros pero se suministraron 1 parámetros ” hy000 ‘

Estoy usando Python 3.6, pyodbc, y me conecto a SQL Server.

Estoy tratando de hacer conexión a una base de datos, y luego crear una consulta con parámetros.

Aquí está el código:

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 

Cuando ejecuto el progtwig sin parámetros en SQL, funciona.

Cuando bash ejecutarlo con parámetros, se produjo un error.

Los parámetros en una statement SQL a través de ODBC son posicionales, y están marcados con un ? . Así:

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

Además, es mejor evitar pasar las fechas como cadenas. Deje que pyodbc se encargue de eso utilizando el datetime de 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) 

luego simplemente pasa los parámetros como se indica arriba. Si prefiere el análisis de cadenas, vea esta respuesta .

Intenté y tengo muchos errores diferentes: 42000, 22007, 07002 y otros

La versión de trabajo es abajo:

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

Tuve un problema similar Vio que bajar la versión de PyODBC a 4.0.6 y SQLAlchemy a 1.2.9 corrigió el error, usando Python 3.6

Si estás tratando de usar pd.to_sql() como yo, solucioné el problema al pasar un parámetro llamado chunksize.

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

espero que esto ayude