2016-08-27 3 views
0

ich für einen pädagogischen Zweck des folgenden Code verwenden:Was macht cur.fetchone() [0]?

import json 
import sqlite3 

conn = sqlite3.connect('rosterdb.sqlite') 
cur = conn.cursor() 


# Do some setup 
cur.executescript(''' 
DROP TABLE IF EXISTS User; 
DROP TABLE IF EXISTS Member; 
DROP TABLE IF EXISTS Course; 

CREATE TABLE User (
    id  INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, 
    name TEXT UNIQUE 
); 

CREATE TABLE Course (
    id  INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, 
    title TEXT UNIQUE 
); 

CREATE TABLE Member (
    user_id  INTEGER, 
    course_id INTEGER, 
    role  INTEGER, 
    PRIMARY KEY (user_id, course_id) 
) 
''') 

fname = raw_input('Enter file name: ') 

if (len(fname) < 1) : fname = 'roster_data.json' 

# [ 
# [ "Charley", "si110", 1 ], 
# [ "Mea", "si110", 0 ], 

str_data = open(fname).read() 
json_data = json.loads(str_data) 


for entry in json_data: 

    name = entry[0]; 
    title = entry[1]; 
    role = entry[2]; 

# print name, title, role 

    cur.execute('''INSERT OR IGNORE INTO User (name) 
     VALUES (?)''', (name,)) 
    cur.execute('SELECT id FROM User WHERE name = ? ', (name,)) 
    user_id = cur.fetchone()[0] 

    cur.execute('''INSERT OR IGNORE INTO Course (title) 
     VALUES (?)''', (title,)) 
    cur.execute('SELECT id FROM Course WHERE title = ? ', (title,)) 
    course_id = cur.fetchone()[0] 

    cur.execute('''INSERT OR REPLACE INTO Member 
     (user_id, course_id, role) VALUES (?, ?, ?)''', 
     (user_id, course_id, role)) 

    conn.commit() 

Was bedeuten cur.fetchone() [0] tun? Warum ist die cur.fetchnone() [0] beim Auffüllen der Member-Tabelle nicht notwendig?

Sie können die JSON-Datei herunterladen, die auf vom Programm gelesen wird:

https://pr4e.dr-chuck.com/tsugi/mod/sql-intro/roster_data.php?PHPSESSID=7530ba71982b2e10c3f61bd0cb1bfcb5

Antwort

1

cur.fetchone() ruft mindestens eine Ergebniszeile für die Abfrage, die auf diesem Cursor ausgeführt wurde. Eine Zeile ist immer eine Folge von 1 oder mehr Spalten, und [0] indiziert diese Zeile, um das erste Element zu erhalten.

Es ist nur sinnvoll, Ergebnisse von einer SELECT Abfrage abzurufen; in INSERT fügt Daten zur Datenbank hinzu und es gibt keine Ergebnisse, die für diese Operation abgerufen werden.

Die Abfragen SELECT rufen zusätzliche Informationen ab, die in die Member-Tabelle eingefügt werden. Die Spalten id in den Tabellen Benutzer und Kurs sind autoinkrementierend, so dass jedes Mal, wenn Sie eine Zeile einfügen, eine neue ID für diese neuen Zeilen generiert wird. Die SELECT-Anweisungen rufen diese ID-Werte ab, sodass sie in der Member-Tabelle verwendet werden können.