42000您的SQL语法有错误;请查看与您的MySQL s相对应的手册

2024-09-28 05:15:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我的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的形式为:

^{pr2}$

(process_query会继续一些,但这仅仅是为了打印目的,当我在web上搜索我的问题时,问题似乎在于我如何调用execute函数,因此我省略了函数的其余部分)。在

当我试图执行此程序时收到的错误是:

pyodbc.ProgrammingError: ('42000', "[42000] [MySQL][ODBC 5.1 Driver][mysqld-5.1.66-0+squeeze1-log]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'John', [Decimal('32.5'), Decimal('7.5')], 'Yes']'' at line 1 (1064) (SQLExecDirectW)")

如果有人知道如何省略“十进制”当我打印,而只是有一个例子32.5,以及希望得到帮助。在

另外,我知道关于这个问题已经有好几个话题了,但是我还没有看到和理解select语句的问题。在

编辑

关于“我”的实施方式如下:

我有一个名为“列表”的初始列表,其中包含所有相关的社会保障号码,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)

我将流程查询更新为:

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'),我相信这是因为我是一个社会安全数字,因此不是一个单位数整数,但我不知道如何解决这个问题。在

我现在叫我的as:

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)

列表中的i在定义温度的循环之前标识,如下所示:

theList=process_query('SELECT DISTINCT SSN FROM Employee', None)

它删除了所有其他的错误,但给了我一个新的,如前所述。另外,我试图将“I”转换为int(I)和map(int,I),而不从错误中获得释放。在


Tags: fromonemployeewherequeryprocessselecttemp
1条回答
网友
1楼 · 发布于 2024-09-28 05:15:53

在您的process_query函数的cursor.execute()调用中的Use query parameters。这将处理任何转义问题(保护代码不受SQL注入的影响)并提升statement preparation。在

更改process_query函数以接受两个参数,一个用于SQL字符串(包含参数值占位符),另一个用于参数值:

def process_query(sql, params):
    cursor1.execute(sql, params)

然后for循环将变为:

^{pr2}$

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

相关问题 更多 >

    热门问题