dimanche 3 janvier 2016

Working with databases with Python: Course registration data in JSON

I am able to get my Python code to run print the desired results, but my problem is with the SQLite table. I was asked to apply this SQL command to the tables:

SELECT hex(User.name || Course.title || Member.role ) AS X FROM User JOIN Member JOIN Course ON User.id = Member.user_id AND Member.course_id = Course.id ORDER BY X

I was able to execute the command in SQLite, but according to the instructions for this project, X is supposed to start with 416 in row one of the results column produced. However, the X I got for row 1 in the results was:

43616C6962736933313030

Here is what I wrote in Python so far:

import sqlite3
import json

#Working with Java and Sqlite

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

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 Member(
user_id INTEGER UNIQUE,
course_id INTEGER UNIQUE,
    role INTEGER,
PRIMARY KEY (user_id, course_id)
);

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

#primary key for junction table is composite of both user_id and course_id

fname = raw_input("Enter file name:")
if (len(fname) < 1): fname = 'roster_data.json'

#prompts for file name

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

#opens the file and reads it all
#loads the json data and now is a python list
for entry in json_data:
    title = entry[1];
    name = entry [0];
    role = entry[2];
    #["Charley, "sill0", 1] represents the name, course title, and role

    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))

#INSERT, SELECT AND FETCHONE STATEMENTS
    conn.commit()

Here is the JSON data that I was working with. It is about course registration for students: roster_data.json Here is the link to it:

http://ift.tt/1Ougc6U

I am not sure if I implemented the "role" key correctly. Thank you for your inputs!

Aucun commentaire:

Enregistrer un commentaire