python3,sqlite3 如何把json文件存在数据库

这个就比XML简单多了,因为json有自己的格式和相关库,直接load一下就是个数组啊!

以下的用例依旧来自py4e,目的是把json文档按合适的关系模式存在数据库中。json中记录用户名,课程名称,和关系role(0是学生,1是教师)。为了减少重复,先建两张表course和user,然后中间建一个member去做映射。

relationship.png
  1. json的一段,先写代码调一下json的输出。
[
  [
    "Kenan",
    "si110",
    1
  ],
  [
    "J",
    "si110",
    0
  ],
  [
    "Shayna",
    "si110",
    0
  ],
  [
    "Kristofer",
    "si110",
    0
  ],
]
#python
import json

fname = 'roster_data.json'
handle = open(fname).read()
data = json.loads(handle)

for entry in data:
    print(entry)
# python output 
('Kenan', 'si110', 1)
('J', 'si110', 0)
('Shayna', 'si110', 0)
  1. 然后把数据库加上就行了。
import json
import sqlite3

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

# setup tables and schema 
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 = 'roster_data.json'
fname = input('Enter file name: ')
if len(fname) < 1:
    fname = 'roster_data.json'

#read JSON file 
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()

2018.4.29

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,680评论 19 139
  • 1、引言 数据库设计过程中表、字段等的命名规范也算是设计规范的一部分,不过设计规范更多的是为了确保数据库设计的合理...
    SnowflakeCloud阅读 41,257评论 0 48
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,812评论 18 399
  • 小说简介: 父亲,是每一个少年的榜样,就像是一座令人安心的大山。可是,如果父亲是一位狂暴战士的话,事情会不会不同呢...
    阎浮小学僧阅读 546评论 8 1
  • 人在职场,难免因为工作需要被分配到完全不熟悉的工作或者从来没有涉足过的领域。面对这种情况,如果有一个称职的“老司机...
    肥宅V阅读 621评论 0 1

友情链接更多精彩内容