【问题标题】:42000 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server42000 您的 SQL 语法有错误;检查与您的 MySQL 服务器相对应的手册
【发布时间】:2013-07-31 12:27:53
【问题描述】:

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

【问题讨论】:

  • 变量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 Coalesce(Hours,0) FROM Works_On WHERE ESSN='% s'" %i) temp.append(known_hours) 是。
  • 您能否相应地编辑您问题中的源代码?这将比 cmets 更具可读性。
  • 请用theList的一些示例数据更新问题

标签: python mysql pyodbc


【解决方案1】:

Use query parameters 在您的process_query 函数的cursor.execute() 调用中。这将处理任何转义问题(保护您的代码免受 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)

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

【讨论】:

  • 感谢您的回答!它确实消除了一些错误!但是我遇到了一个新的,它已被编辑到我的原始帖子中。但再次感谢!真的很感激。
猜你喜欢
  • 2019-11-22
  • 2021-12-03
  • 2017-09-20
  • 1970-01-01
  • 2018-11-09
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多