42000您的SQL语法有错误;查看与MySQL服务器对应的手册

时间:2013-07-31 12:27:54

标签: python mysql pyodbc

我的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)而不从我的错误中获取释放。

1 个答案:

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

如果这不能解决语法问题,请使用导致问题的查询字符串更新您的问题。