我的 Python odbc 代码有问题。我没有让以下代码工作:
temp=process_query("SELECT FName, LName FROM Employee WHERE SSN='%s'" %i)
known_hours=process_query("SELECT DISTINCT Coalesce(Hours,0)
FROM Works_On WHERE ESSN='%s'" %i)
temp.append(known_hours)
其中 process_query 采用以下形式:
def process_query(query):
cursor1.execute(str(query))
(process_query 继续,但这只是为了打印目的,当我在网上搜索我的问题时,问题似乎在于我如何调用执行函数,所以我在这里省略了函数的其余部分)。
我尝试执行此程序时收到的错误是:
pyodbc.ProgrammingError: ('42000', "[42000] [MySQL][ODBC 5.1 Driver][mysqld-5.1.66-0+squeeze1-log]您的 SQL 语法有错误;请查看与您对应的手册MySQL 服务器版本,用于在第 1 行 (1064 (SQLExecDirectW)") 附近使用的正确语法
PS。如果有人知道如何在我打印时省略“十进制”,而只使用例如 32.5 来获得帮助,我们将不胜感激。
我也知道这已经有几个主题了,但我还没有看到并理解我对 select 语句的问题。
编辑
关于“i”的实现方式如下:
我有一个名为 theList 的初始列表,其中包含所有相关的社会安全号码 SSN,然后我像这样“循环”通过它:
for i in theList:
temp=process_query("SELECT FName, LName FROM Employee WHERE SSN='%s'" %i)
known_hours=process_query("SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN='%s'" %i)
temp.append(known_hours)
unknown_hours=process_query("SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN='%s'" %i)
temp.append(unknown_hours)
编辑
我已经按照小熊的建议进行了更改。但是,我现在遇到了另一个错误,即由于我循环遍历列表中的 i(社会安全号码),因此我必须先定义这些。
因此我使用这条线
theList=process_query('SELECT DISTINCT SSN FROM Employee', None)
我已将我的 process_query 更新为:
def process_query(query, parameters):
if(parameters is None):
cursor1.execute(query)
else:
cursor1.execute(query, parameters) (*)
n=0
lista = []
while 1:
row = cursor1.fetchone()
if not row:
break
lista.append(row[0])
n = n+1
if n==0:
print "No tuples matching the given query were found."
return lista
现在的问题是程序在第二个 cursor1.execute(标有星号,*)处抱怨('SQL 包含 1 个参数标记,但提供了 4 个参数','HY000'),我相信这源于我是一个社会安全号码,因此不是个位数的整数,但我不明白如何解决这个问题。
我现在称我为:
temp=process_query('SELECT FName, LName FROM Employee WHERE SSN= ?', i)
known_hours=process_query('SELECT DISTINCT SUM(Coalesce(Hours,0)) FROM Works_On WHERE ESSN=?', i)
theList 中的 i 在定义 temp 的循环之前标识,如下所示:
theList=process_query('SELECT DISTINCT SSN FROM Employee', None)
它消除了所有其他错误,但如前所述给了我一个新错误。此外,我尝试将“i”转换为 int(i) 和 map(int,i),而没有从我的错误中得到释放。