2012-07-02 100 views
1

當我執行的代碼(見下文),我得到了一個錯誤Python和MySQL的STR_TO_DATE

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() 

爲什麼我得到這個錯誤?謝謝。

回答

1

你不顯示什麼MIN_DURATION是,但你使用%(min_duration)d,所以它需要是一個int。你有沒有把它定義爲一個字符串或浮點數?

您不需要在這樣的SQL查詢中使用%d,數據庫適配器就會理解您傳遞它的類型,並將它們正確地插入到查詢中。使MIN_DURATION爲整數(可能在代碼中使用int(MIN_DURATION)),它將起作用。

順便說一句:堆棧跟蹤將您的注意力集中在str(start_date)上,但這只是因爲這是可執行語句中出現錯誤的最後一行源代碼,所以這是誤導性的。

+0

MIN_DURATION取自配置。 MIN_DURATION = 1 – KennyPowers

+0

即使使用int(MIN_DURATIN),仍然不會執行操作..通過它的type()的int方式與member_id相同 – KennyPowers

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)