pyodbc编程错误

时间:2013-11-27 14:00:36

标签: python sql pyodbc

我正在尝试使用以下代码查询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语句。

1 个答案:

答案 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