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