web-dev-qa-db-fra.com

pyodbc le sql contient des marqueurs de paramètres mais 1 paramètre a été fourni '' hy000 '

J'utilise Python 3.6, pyodbc et me connecte à SQL Server.

J'essaie d'établir une connexion avec une base de données, puis de créer une requête avec des paramètres.

Voici le code:

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

Lorsque je lance le programme sans paramètres en SQL, cela fonctionne.

Lorsque j'essaie de l'exécuter avec des paramètres, une erreur s'est produite.

4
Aleks

Les paramètres d'une instruction SQL via ODBC sont positionnels et marqués d'un ?. Ainsi:

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

De plus, il vaut mieux éviter de passer des dates en tant que chaînes. Laissez pyodbc s'occuper de cela en utilisant le 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)

puis passez les paramètres comme ci-dessus. Si vous préférez analyser les chaînes, voir cette réponse .

12
themiurge

J'ai eu un problème similaire. Vu que déclasser la version de PyODBC à 4.0.6 et SQLAlchemy à 1.2.9 corrigeait l’erreur, en utilisant Python 3.6

0
Poo22

Si vous essayez d'utiliser pd.to_sql() comme moi, j'ai résolu le problème en transmettant un paramètre appelé chunksize.

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

j'espère que cela t'aides

0
Kevin Ruder

j'ai essayé et j'ai beaucoup d'erreurs différentes: 42000, 22007, 07002 et autres

La version de travail est ci-dessous:

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