我正在尝试使用以下代码查询SQL Server 2012数据库:
import pyodbc
class sqlserverConnector:
def __init__(self, connectionString):
"""
this is a typical connection string using windows authentication and the DSN manager:
'DSN=python;Trusted_Connection=yes'
"""
self._conn = pyodbc.connect(connectionString)
self._curs = self._conn.cursor()
self.fetchall = self._curs.fetchall
self.description = self._curs.description
self.columns = dict()
def __del__(self):
self._conn.close()
def __iter__(self):
return self._curs.__iter__()
# executes SQL statements
def execute(self, statement, **params):
if params is None:
self._curs.execute(statement)
else:
self._curs.execute(statement,params)
# creates a dictionary of column names and positions
if self._curs.description != None:
self.columns = dict((field[0], pos) for pos, field in enumerate(self._curs.description))
else:
None
和
from sqlutil import *
sqlcnxn = sqlserverConnector('DSN=python;Trusted_Connection=yes')
rows = sqlcnxn.execute("select * from demographics", params=None)
for row in rows:
print row
break
目标是打印出一行(该表有80k +行)。但是我总是收到此错误消息:
pyodbc.ProgrammingError: ('The SQL contains 0 parameter markers, but 1 parameters were supplied', 'HY000')
我已经google了一下,似乎这种情况因不同的原因而出现在不同的人身上,而且我发现的解决方案都不符合我的错误。我认为发生的事情是execute
方法默认为第一个else
语句而不是第一个if
语句。
答案 0 :(得分:2)
当您使用**params
表示法时,params
始终字典。
使用params=None
调用该函数意味着您现在拥有一个字典:
>>> def func(**params):
... print params
...
>>> func()
{}
>>> func(params=None)
{'params': None}
>>> func(foo='bar')
{'foo': 'bar'}
语法用于接受任意关键字参数,如上面的foo
关键字参数所示。
删除**
或测试空字典,并且在调用params=None
时不要设置.execute()
:
def execute(self, statement, **params):
if not params:
self._curs.execute(statement)
else:
self._curs.execute(statement, params)
# ...
和
rows = sqlcnxn.execute("select * from demographics")
请注意,您的execute()
函数没有return
语句,这意味着rows
将设置为None
(函数的默认返回值)。如果您想要返回连接对象以便可以迭代它,请添加return self
。