gpt4 book ai didi

python - pyodbc 编程错误

转载 作者:行者123 更新时间:2023-12-01 05:31:14 30 4
gpt4 key购买 nike

我尝试使用以下代码查询 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')

我用谷歌搜索了一下,似乎这个问题会因为不同的原因而出现在不同的人身上,而且我找到的解决方案都不适合我的错误。我认为发生的情况是 execute 方法默认为第一个 else 语句,而不是第一个 if 语句。

最佳答案

当您使用**params表示法时,params始终是一个字典。

使用 params=None 调用该函数意味着您现在拥有一个包含以下内容的字典:

>>> def func(**params):
... print params
...
>>> func()
{}
>>> func(params=None)
{'params': None}
>>> func(foo='bar')
{'foo': 'bar'}

该语法旨在接受任意关键字参数,如上面的 foo 关键字参数所示。

删除 ** 或测试空字典,并且在调用 .execute() 时不要设置 params=None :

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

关于python - pyodbc 编程错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20244477/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com