【发布时间】: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的一些示例数据更新问题