2

当我执行代码时(见下文)我得到了下一个错误

Traceback (most recent call last):
File "/home/test/python/main.py", line 18, in <module>
  calls = tel.getCallRecordings(member['id'], member['start_date'])
File "/home/test/python/teldb.py", line 49, in getCallRecordings
  'start_date': str(start_date),
File "/usr/local/lib/python2.5/site-packages/MySQL_python-1.2.3-py2.5-freebsd-8.1-RELEASE-amd64.egg/MySQLdb/cursors.py", line 159, in execute
TypeError: int argument required

我使用的代码是下一个:

def getCallRecordings(self, member_id, start_date):       
    self.cursor.execute("""
    SELECT var10 as filename,
           var9 as duration
    FROM csv_data c
    LEFT JOIN transcriptions t ON
        c.id=t.call_id
    WHERE member_id=%(member_id)s AND
          var10 IS NOT NULL AND
          var9>%(min_duration)d AND
          dialed_date>STR_TO_DATE(%(start_date)s, '%%Y-%%m-%%d %%H:%%i:%%s') AND
          t.call_id IS NULL
    ORDER BY dialed_date DESC
    """, {
        'member_id': member_id,
        'min_duration': MIN_DURATION,
        'start_date': str(start_date),
        })
    logging.debug("Executed query: %s" % self.cursor._executed)
    return self.cursor.fetchone()

为什么我得到这个错误?谢谢。

4

2 回答 2

1

你不显示什么MIN_DURATION是,但你使用%(min_duration)d,所以它必须是一个 int。您是否将其定义为字符串或浮点数?

您不需要在这样的 SQL 查询中使用 %d ,数据库适配器了解您传递的类型,并将它们正确地插入到查询中。制作MIN_DURATION一个整数(可能int(MIN_DURATION)在您拥有的代码中),它会起作用。

顺便说一句:堆栈跟踪将您集中在str(start_date),但只是因为这是可执行语句中出现错误的最后一个源代码行,所以它具有误导性。

于 2012-07-02T12:54:33.413 回答
0

在构建涉及 str_to_date 函数的 sql 查询字符串时,我遇到了类似的问题。我在 python 字符串上使用了 .format() 运算符来参数化 SQL 查询。这是一个可以正常工作的示例查询:

# Takes an input date and returns the manager's name during that period
input_string='"' + "{input_data}".format(input_data=input_data) + '"' 

sql_query='''select CONCAT(e.last_name, ",", e.first_name),STR_TO_DATE(from_date,'%Y-%m-%d'),STR_TO_DATE(to_date,'%Y-%m-%d') from dept_manager dm inner join employees e on e.emp_no=dm.emp_no where STR_TO_DATE({input_string},'%Y-%m-%d')>STR_TO_DATE(from_date,'%Y-%m-%d') and STR_TO_DATE({input_string},'%Y-%m-%d')<STR_TO_DATE(to_date,'%Y-%m-%d');'''.format(input_string=input_string)
于 2015-04-29T19:56:46.597 回答