使用Python处理数据库:JSON中的课程注册数据

使用Python处理数据库:JSON中的课程注册数据,python,json,sqlite,Python,Json,Sqlite,我能够让Python代码运行并打印出所需的结果,但我的问题是SQLite表。我被要求将此SQL命令应用于表: 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 我能够在SQLite中执行该命令

我能够让Python代码运行并打印出所需的结果,但我的问题是SQLite表。我被要求将此SQL命令应用于表:

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
我能够在SQLite中执行该命令,但根据该项目的说明,X应该从生成的结果列的第一行中的416开始。但是,结果中第1行的X为:

43616C6962736933313030

以下是我迄今为止用Python编写的内容:

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()
下面是我正在处理的JSON数据。这是关于学生的课程注册:花名册_data.json以下是链接:


我不确定我是否正确实现了角色密钥。感谢您的投入

问题是您使Member.course\u id唯一。因此,您的成员数不能超过课程数。在INSERT或REPLACE into成员中使用REPLACE可隐藏此错误


只需删除Member.course上的唯一约束,您将获得预期结果。

无法打开给定链接我们没有运行LTI,因此我们无法访问您的链接数据。您可能需要考虑另一种方法来共享这个或可能有用的子集吗?我不知道如何将文件附加到这个网站。如果有人能提出建议,请告诉我。实际上我对此很好奇。我使用了JSON的在线编辑器,它说我可以公开共享该文件。我相信Member.user_id也不能是唯一的。因为一个用户可以出现多次。同意,一个用户成为多个课程的成员似乎很自然。是的,我也同意。再次感谢你~