将字符串参数传递给mysql

将字符串参数传递给mysql

问题描述:

我想使用argparse从参数中解析一个值。当我用“打印”测试我的条件时,它工作正常。当我现在将值添加到我的sql代码时,会发生错误。请原谅我不太漂亮的sql查询,这是我可以获取我需要的数据的唯一方法。将字符串参数传递给mysql

错误消息:类型错误:必须是字符串或只读缓冲器,而不是元组

import mysqldb 
import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('-m','--machine', nargs=1, help="Machine Hostname", action="store") 
args = parser.parse_args() 

query = (""" select ifname, usname, mtdesc, lobuilding Location from 
interface left join machine on ifmcid=mcid 
left join machine_type on mcmtid=mtid left join user on mcusid=usid left join location on mcloid=loid 
WHERE mccurrentosid = 32 AND ifname = %s """, (args.machine,)) 
cur.execute(query) 
for row in cur.fetchall(): 
print row 
+0

是你会得到错误信息? – jsbueno

+0

TypeError:必须是字符串或只读缓冲区,而不是元组 – gratchie

+0

因此,您的答案也是如此 - 将'args.machine'参数作为简单参数传递,不需要封装在元组中,就像字符串格式化一样使用'%'运算符。 – jsbueno

查询参数传送到​​:

query = """ 
    select 
     ifname, usname, mtdesc, lobuilding 
    from 
     interface 
     left join 
      machine 
     on 
      ifmcid=mcid 
     left join 
      machine_type 
     on 
      mcmtid=mtid 
     left join 
      user 
     on 
      mcusid=usid 
     left join 
      location 
     on 
      mcloid=loid 
    WHERE 
     mccurrentosid = 32 AND 
     ifname = %s 
""" 
cur.execute(query, (args.machine,)) 
+0

现在我收到了一个不同的错误:_mysql_exceptions.ProgrammingError:(1064,“你的SQL语法有错误;检查与你的MySQL服务器版本相对应的手册, “) – gratchie

+0

@gratchie请注意,我已经把FIXME放到查询中了 - 应该在'lobuilding'和'Location'之间有一个逗号? – alecxe

+0

我实际上可以删除'位置'。这里是我目前的sql:query =“”“select ifname,usname,mtdesc,从接口左边连接机器上建立ifmcid = mcid left join machine_type on mcmtid = mtid左边连接用户on mcusid = usid左边连接位置on mcloid = loid WHERE mccurrentosid = 32 AND ifname =%s“”“ cur.execute(query,(args.machine,)) for row in cur.fetchall(): print row – gratchie

尝试不同的排列组合后,终于得到了一个工作代码。我必须删除args.machine中的','。也许“左连接”语句不再需要它。

cur.execute(query, (args.machine)) 

感谢您的帮助@alecxe