2016-08-27 2 views
0

Я использую следующий код для образовательных целей:Что делает 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() 

Что cur.fetchone() [0] делать? Почему cur.fetchnone() [0] не требуется при заполнении таблицы Member?

Вы можете скачать файл в формате JSON, который считывается программой в:

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

ответ

1

cur.fetchone() извлекает один результирующий ряд для запроса, который был выполнен на этом курсор. Строка всегда представляет собой последовательность из 1 или более столбцов, а [0] индексирует эту строку для получения первого элемента.

Имеет смысл только получить результаты из запроса SELECT; в INSERT добавляет данные в базу данных и результатов для этой операции нет.

Запросы SELECT запрашивают дополнительную информацию для вставки в таблицу Member. Столбцы id в таблицах пользователя и курса: autoincrementing, поэтому каждый раз, когда вы вставляете строку, для этих новых строк создается новый идентификатор. Операторы SELECT извлекают эти значения id, чтобы их можно было использовать в таблице Member.