1

我的 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),而没有从我的错误中得到释放。

4

1 回答 1

1

在函数cursor.execute()调用中使用查询参数process_query。这将处理任何转义问题(保护您的代码免受 SQL 注入)并促进语句准备

更改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)

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

于 2013-07-31T15:00:23.720 回答