2016-09-21 4 views
0

私はpythonとsqlite3でクエリをテストしています。最初の方法は問題なく動作しますが、 秒は機能しません。それはDBでresgistersを含む変数の定義された型についてです:PythonでSQLite3のクエリ

import sqlite3 

def insertar(): 

    db1=sqlite3.connect('tabla.db') 
    print("Estas en la funcion insertar") 

    nombre1=raw_input("Escribe el titulo de la novela: ") 
    autor1=raw_input("Escribe el autor de la novela: ") 
    year1=str(input("Digita el any de la novela: ")) 

    consulta=db1.cursor() 

    strConsulta = "insert into tabla(nombre, autor, year) values\ 
    ('"+nombre1+"','"+autor1+"','"+year1+"')" 
    print(strConsulta) 

    consulta.execute(strConsulta) 
    consulta.close() 
    db1.commit() 
    db1.close() 

def consultar(): 
    db2 = sqlite3.connect("tabla.db") 
    print("Estas en la funcion insertar") 
    db2row_factory = sqlite3.Row 
    consulta = db2.cursor() 
    consulta.execute("select * from tabla") 
    filas = consulta.fetchall() 
    lista = [] 
    for fila in filas: 
     s = {} 
     s['nombre'] = fila['nombre'] 
     s['autor'] = fila['autor'] 
     s['year'] = str(fila['year']) 
     lista.append(s) 

    consulta.close() 
    db2.close() 
    return(lista) 


#consultar() 

def menu(): 
    Opcion= input("\nIngresa la opcion deseada\n1.Inserta un valor en la tabla\n2.Consultar los valores de la tabla\n") 
    if Opcion==1: 
     insertar() 
     menu() 
    elif Opcion==2: 
     ListaNovelas = consultar() 
     for novela in ListaNovelas: 
      print(novela['nombre'],novela['autor'],novela['year']) 
     menu() 

menu() 

第二の方法consultar()をテストしながら、私はこのエラーを取得します。

$ python file.py 

Ingresa la opcion deseada 
1.Inserta un valor en la tabla 
2.Consultar los valores de la tabla 
2 
Estas en la funcion insertar 
Traceback (most recent call last): 
    File "insertar.py", line 56, in <module> 
    menu() 
    File "insertar.py", line 51, in menu 
    ListaNovelas = consultar() 
    File "insertar.py", line 33, in consultar 
    s['nombre'] = fila['nombre'] 
TypeError: tuple indices must be integers, not str 
+0

クエリは、dictsではなく、タプルルのリストを返します。それがタプルから鍵 'nombre'を得ることができない理由です。 – Alex

答えて

1

db2row_factory = sqlite3.Row

これは問題線です。代わりにあなたがdb2接続インスタンス上row_factory工場を設定するためのもの:

db2.row_factory = sqlite3.Row 

そして、全てのフェッチされた行は現在のフィールド値を辞書のようなアクセス権を持つsqlite3.Rowインスタンスになります。

+0

投稿した直後にそれを見ました。 f ***。とにかくありがとう! – Hell0