我的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继续更多,但仅仅是为了打印目的,当我在网上搜索我的问题时,似乎问题在于我如何调用execute函数,所以我省略了函数的其余部分)。
我在尝试执行此程序时收到的错误是:
pyodbc.ProgrammingError:('42000',“[42000] [MySQL] [ODBC 5.1驱动程序] [mysqld-5.1.66-0 + squeeze1-log]您的SQL语法有错误;请查看手册对应于您的MySQL服务器版本,以便在'John'附近使用正确的语法,[Decimal('32 .5'),Decimal('7.5')],'Yes']''在第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)
在定义temp的循环之前识别列表中的i,如下所示:
theList=process_query('SELECT DISTINCT SSN FROM Employee', None)
删除了所有其他错误但是如前所述让我换了一个新错误。此外,我试图将“i”转换为int(i)和map(int,i)而不从我的错误中获取释放。
答案 0 :(得分:1)
cursor.execute()
函数的process_query
调用中的Use query parameters。这将处理任何转义问题(保护您的代码免受SQL注入)并提升statement preparation。
更改process_query
函数以接受两个参数,一个用于SQL字符串(包含参数值占位符),另一个用于参数值:
def process_query(sql, params):
cursor1.execute(sql, params)
然后for
循环将更改为:
for i in theList:
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)
temp.append(known_hours)
unknown_hours=process_query('SELECT Distinct COUNT(*) FROM Works_On WHERE ISNULL(Hours) AND ESSN=?', i)
temp.append(unknown_hours)
如果这不能解决语法问题,请使用导致问题的查询字符串更新您的问题。