【问题标题】:TypeError: not enough arguments for format stringTypeError:格式字符串的参数不足
【发布时间】:2012-04-06 16:19:24
【问题描述】:

我正在尝试使用Tornado's database wrapper 执行查询,就像这样 -

p_id = db.execute_lastrowid("""INSERT INTO `gplaces`.`place` 
                                    (`gid`, `name`, `reference`, `lat`, `long`, `vicinity`) 
                                    VALUES (%s, %s, %s, %s, %s, %s)""", 
                                    (
                                        str(place['id']),
                                        str(place['name']),
                                        str(place['reference']),
                                        float(place['geometry']['location']['lat']),
                                        float(place['geometry']['location']['lng']),
                                        str(place['vicinity'])
                                    )
                                )

但总是在标题中出现错误。这是回溯 -

Traceback (most recent call last):
  File "insertbs.py", line 38, in <module>
    str(place['vicinity'])
  File "/home/bibhas/Works/yodl/database.py", line 145, in execute_lastrowid
    self._execute(cursor, query, parameters)
  File "/home/bibhas/Works/yodl/database.py", line 207, in _execute
    return cursor.execute(query, parameters)
  File "/usr/lib/pymodules/python2.7/MySQLdb/cursors.py", line 159, in execute
    query = query % db.literal(args)
TypeError: not enough arguments for format string

不知道我做错了什么。

【问题讨论】:

    标签: python tornado mysql-python


    【解决方案1】:

    不要传递值的元组,将它们作为单独的参数传递。

    从追溯:

    query = query % db.literal(args)
    

    注意在 - args 中插入了什么。基本上,只需删除您传入的内容周围的(),以便将它们作为参数传递。

    【讨论】:

    • 你的意思是像字典一样?对不起,如果我听起来像个菜鸟。
    • 不,我的意思是不要做db.execute_lastrowid("query", (a,b,c)),而是做db.execute_lastrowid("query", a, b, c)
    • 知道了。那行得通。谢谢。 :) 看到parameters 我很困惑,因为我认为这将是一个单一变量,所有数据都是元组。
    • 如何在 python sql = ("SELECT car,colour FROM tblcar WHERE size = '%s' or size ='%s'" % search_string %search_string1) 中给出两个或多个条件适用于任何两种特定尺寸
    【解决方案2】:

    感谢 Amber,我只是发布一个示例:

     p_id = db.execute_lastrowid("""INSERT INTO `gplaces`.`place` 
                                    (`gid`, `name`, `reference`, `lat`, `long`, `vicinity`) 
                                    VALUES (%s, %s, %s, %s, %s, %s)""", 
    
                                     str(place['id']),
                                     str(place['name']),
                                     str(place['reference']),
                                     float(place['geometry']['location']['lat']),
                                     float(place['geometry']['location']['lng']),
                                     str(place['vicinity'])
    
                                )
    

    所以,在您只传递一个参数之前,一个包含所有参数的元组。在此示例中,您传递了 6 个参数,这是它所期望的。

    【讨论】:

      猜你喜欢
      • 2012-06-24
      • 2020-10-17
      • 2012-06-11
      • 2019-01-17
      • 2017-12-18
      • 2018-06-07
      • 2020-03-10
      • 2021-04-01
      相关资源
      最近更新 更多