2012-08-13 89 views
3

我一直在學習使用python的sqlite3。現在,我有一個功能只需要一個詞,並在互聯網上查找該詞的定義。然後我嘗試將該單詞存儲在一個表中,並將定義存儲到通過外鍵鏈接在一起的另一個表中。插入sqlite3值時Python TypeError?

像這樣:

#! /usr/bin/env python 
import mechanize 
from BeautifulSoup import BeautifulSoup 
import sys 
import sqlite3 

def dictionary(word): 
    br = mechanize.Browser() 
    response = br.open('http://www.dictionary.reference.com') 
    br.select_form(nr=0) 
    br.form['q'] = word 
    br.submit() 
    definition = BeautifulSoup(br.response().read()) 
    trans = definition.findAll('td',{'class':'td3n2'}) 
    fin = [i.text for i in trans] 
    query = {} 
    word_count = 1 
    def_count = 1 
    for i in fin: 
     query[fin.index(i)] = i 
    con = sqlite3.connect('vocab.db') 
    with con: 
     spot = con.cursor() 
     spot.execute("SELECT * FROM Words") 
     rows = spot.fetchall() 
     for row in rows: 
      word_count += 1 
     spot.execute("INSERT INTO Words VALUES(?,?)", word_count,word) 
     spot.execute("SELECT * FROM Definitions") 
     rows = spot.fetchall() 
     for row in rows: 
      def_count += 1 
     for q in query: 
      spot.execute("INSERT INTO Definitions VALUES(?,?,?)", def_count,q,word_count) 
    return query 

print dictionary(sys.argv[1]) 

當我運行它:

./database_trial.py 'pass' 

這是錯誤消息:

Traceback (most recent call last): 
    File "./database_trial.py", line 37, in <module> 
    print dictionary(sys.argv[1]) 
    File "./database_trial.py", line 28, in dictionary 
    spot.execute("INSERT INTO Words VALUES(?,?)", word_count,word) 
TypeError: function takes at most 2 arguments (3 given) 

我只有兩個參數傳遞給函數內部'字'表,但是,消息說有三個?

spot.execute("INSERT INTO Words VALUES(?,?)", word_count,word) 

我想我可能會搞砸了一些與sys.argv。所以我通過並將該行更改爲:

spot.execute("INSERT INTO Words VALUES(?,?)", word_count, sys.argv[1]) 

我仍然得到了與錯誤消息相同的結果?

回答

7
spot.execute("INSERT INTO Words VALUES(?,?)", word_count,word) 

是傳遞給方法spot.execute三個參數:SQL字符串變量word_count,和變量word。我懷疑值進入數據庫需要被封閉在一個元組,形成一個參數:

spot.execute("INSERT INTO Words VALUES(?,?)", (word_count,word)) 
+0

不勝感激,謝謝! – tijko 2012-08-13 21:50:26

2

execute只需要兩個參數;第二個是要在準備好的SQL語句中使用的所有值的tuple。所以,與其

spot.execute("INSERT INTO Words VALUES(?,?)", word_count,word) 

包裹在一個元組的所有值:

spot.execute("INSERT INTO Words VALUES(?,?)", (word_count, word)) 
#           ^   ^
+0

謝謝,你正在幫我解決今天所有的sqlite3錯誤和混亂問題。認真,但非常有幫助! – tijko 2012-08-13 21:51:48