将字符串参数传递给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
查询参数传送到:
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,))
现在我收到了一个不同的错误:_mysql_exceptions.ProgrammingError:(1064,“你的SQL语法有错误;检查与你的MySQL服务器版本相对应的手册, “) – gratchie
@gratchie请注意,我已经把FIXME放到查询中了 - 应该在'lobuilding'和'Location'之间有一个逗号? – alecxe
我实际上可以删除'位置'。这里是我目前的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
是你会得到错误信息? – jsbueno
TypeError:必须是字符串或只读缓冲区,而不是元组 – gratchie
因此,您的答案也是如此 - 将'args.machine'参数作为简单参数传递,不需要封装在元组中,就像字符串格式化一样使用'%'运算符。 – jsbueno