pyodbc sql包含0个参数标记,但提供了1个参数''hy000'

Ale*_*eks 7 python sql markers pyodbc

我使用的是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
Run Code Online (Sandbox Code Playgroud)

当我在SQL中运行没有参数的程序时,它可以工作.

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

the*_*rge 16

通过ODBC的SQL语句中的参数是位置的,并用a标记?.从而:

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

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

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)
Run Code Online (Sandbox Code Playgroud)

然后只需传递上述参数.如果您更喜欢字符串解析,请参阅此答案.


小智 5

如果你想像pd.to_sql()我一样使用我通过传递一个名为 chunksize 的参数来解决这个问题。

df.to_sql("tableName", engine ,if_exists='append', chunksize=50)
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助