2017-01-28 7 views
0

私は、ときに最初に私はテーブルに新しい行を追加しようとしていたコード(データベースsqliteの)TypeError例外は(と、「リストのインデックスは、strのない整数でなければなりません」)

@get('/inventory/add') 
def inventory_add(db): 
    db.execute("INSERT INTO inventory (name, category, location, date, amount) VALUES (?, ?, ?, ?, ?)", (item['name'], item['category'], item['location'], item['date'], item['amount'])) 

    db.commit() 

のこの作品を書いたIそれを実行私が得た:

NameError("global name 'item' is not defined",) 

をので、私はそれがうまくいく希望でリストとして項目を宣言することを決定したのpythonでの私の経験不足で、インターネットANの周りに掘っ:

item=[] 
@get('/inventory/add') 
def inventory_add(db): 
    db.execute("INSERT INTO inventory (name, category, location, date, amount) VALUES (?, ?, ?, ?, ?)", (item['name'], item['category'], item['location'], item['date'], item['amount'])) 

    db.commit() 

は、したがって、上記のコードを実行した後、私はこれだ:あなたがここに必要なもの

TypeError('list indices must be integers, not str',) 
+1

あなたの 'item'はリストです。 '[]'でインデックスするとき、インデックスは整数でなければなりません。 'item ['location']'は無効で、 'item [0]'は有効です(必ずしも正しいとは限りません)。あるいは、辞書: 'item = {}'を使用してください。その後、文字列インデックス(実際にはキー)は合法です。 – DyZ

+0

'item = {}'を試しましたが、実行すると 'KeyError: 'name'' – JDoe

+0

'item'を初期化するのに使ったコードを表示します。 – DyZ

答えて

2

を辞書ではなく、リストです。だから、これを試してみてください。

item={'name':'somename', 'category':'somecat','location':'someloc', 'date':'somedate','amount':'someamt'} 

を次に、あなたのコードを試してみてください(プログラムがどこ辞書で見て、それは明らかにエラーがスローされます知らない場合は、ここでは空の辞書を宣言していない)、それがあるべきワーキング。

DYZのように、カーソルエラーの場合、カーソルをコミットしようとしていますが、データベースに接続したインスタンスをコミットしようとする必要があります。また、あなたのページに何かを返すか、ページがアクセスされるとユーザーはちょうど立ち往生します。

+0

これはあなたが言ったことをした後です: 'AttributeError: 'sqlite3.Cursor'オブジェクトに 'commit'属性がありません。 – JDoe

+0

@JDoeこれはあなたの_next_問題であり、リスト/ディクショナリの問題とは別です。 inddedのカーソルには '.commit()'メソッドがありません。このメソッドは、データベース接続オブジェクトの一部です。 – DyZ

+0

@JDoe db.commit()のエラーです。関連するコードを表示するために質問を変更して、問題の原因にアクセスできるようにしてください。 – iamnotgoogle

関連する問題