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 を使用する必要はありません。DB アダプターは、渡された型を理解し、クエリに適切に挿入します。整数を作成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 に答える