2017-09-04 2 views
0

enter image description here<sqlite3.Row objet à> dans la base de données clé étrangère

books.book_id = clé primaire

chapters.book_id = clé

étrangère Si mon chapters.book_id regarder la façon dont il le fait dans l'image?

Quand je fais une jointure

cur = db.execute("SELECT books.title, chapters.chapter FROM books INNER JOIN chapters ON books.book_id=chapters.book_id") 

Je viens d'obtenir [] imprimé à l'écran

Ce code insère les données d'un formulaire HTML à ma base de données

@app.route('/newbook') 
def new_book(): 
    return render_template('newbook.html') 

@app.route('/addbook', methods=['GET', 'POST']) 
def addbook(): 
    db = get_db() 
    db.execute("INSERT INTO books (title) VALUES (?)", 
     [request.form['title']]) 
    db.commit() 

    return redirect(url_for('new_chapter')) 


@app.route('/newchapter') 
def new_chapter(): 
    return render_template('newchapter.html') 

@app.route('/addchapter', methods=['GET', 'POST']) 
def addchapter(): 
    db = get_db() 
    cur = db.execute("SELECT last_insert_rowid()") 
    book_id = cur.fetchone() 
    db.execute("INSERT INTO chapters (chapter, book_id) VALUES (?, ?)", [request.form['chapter'], str(book_id)]) 
    db.commit() 

    return redirect(url_for('new_concepts')) 

Répondre

0

Une requête retourne un objet semblable à une table avec (potentiellement) plusieurs lignes et colonnes.

L'itération sur un curseur ou l'appel fetchone() renvoie une ligne à chaque étape.

Une ligne est un tuple contenant toutes les valeurs de colonne. Même lorsqu'il n'y a qu'une seule colonne, sa valeur est toujours enveloppée dans un tuple.

Pour obtenir une valeur unique à partir d'une requête, vous devez extraire du tuple:

book_id = db.execute("SELECT last_insert_rowid()").fetchone()[0] 
#               ^^^ 

S'il vous plaît noter que la valeur de retour de last_insert_rowid() changements après l'insertion du chapitre, donc lorsque vous insérez un deuxième chapitre pour le même livre, il va exploser. Vous devez lire l'ID du livre immédiatement après l'insertion du livre (et le curseur lastrowid attribute est plus simple à utiliser).