【问题标题】:passing string argument to mysql将字符串参数传递给mysql
【发布时间】:2016-02-25 17:25:30
【问题描述】:

我正在尝试使用 argparse 解析参数中的值。当我用“打印”测试我的条件时,效果很好。当我现在将值添加到我的 sql 代码时,就会发生错误。请原谅我不太漂亮的 sql 查询,这是我获得所需数据的唯一方法。

错误信息: TypeError:必须是字符串或只读缓冲区,而不是元组

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

【问题讨论】:

  • 您收到的错误信息是什么?
  • TypeError: 必须是字符串或只读缓冲区,而不是元组
  • 所以,您的答案也有 - 将 args.machine 参数作为普通参数传递,不封装在元组中,就像使用 % 运算符进行字符串格式化所需要的那样。跨度>
  • 对不起,你能举个例子来说明你的建议吗?这里对 python 很陌生。谢谢,
  • 不过,请检查@alexe 的答案。

标签: python mysql-python


【解决方案1】:

查询参数应该传入execute():

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 服务器版本相对应的手册以获取正确的语法在第 23 行的 ')' 附近")
  • @gratchie 请注意,我已将 FIXME 放入查询中 - lobuildingLocation 之间应该有逗号吗?
  • 我实际上可以删除“位置”。这是我当前的 sql: 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,)) for row in cur.fetchall(): print row
【解决方案2】:

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

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

感谢@alecxe 的帮助

【讨论】:

    猜你喜欢
    • 2016-03-16
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 2017-06-04
    相关资源
    最近更新 更多