我明白insert or replace是有則更新,無則插入
insert or ignore是有則忽略,無則插入
但是今天遇到一個問題不明白 為何只能用replace,不能用ignore。
(1)有一個json檔案,每個小的單元里都有name, titile, role三個值

(2)現在創建三個table, 三張table的關系如圖所示,其中user表中的name,course表中的titile,member表中的role的值都來自json檔案,由于是多對多關系,建立了member表中的聯合外鍵。

(3)現在我其他步驟都做好了,最后想把role的值輸入member表中,這個要同時呼叫聯合外鍵,正確能夠跑出結果的代碼如圖所示,但是我最初用的是insert or ignore,這樣輸出的資料庫結果在role列就是NULL。我不明白為什么,因為感覺member這個表并不需要更新(不像計算數數之類需要更新)

完整的正確代碼如下:
import json
import sqlite3
conn = sqlite3.connect('E:/吳悠/大三下/coursera python/assignments/Using Databases with Python/exercise4-1/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 = input('Enter file name: ')
if len(fname) < 1:
fname = 'E:/吳悠/大三下/coursera python/assignments/Using Databases with Python/exercise4-1/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:#entry itself is a row
name = entry[0];
title = entry[1];
role=entry[2]
print((name, title,role))#here print as a tuple
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, ) )# this line input the value into column
cur.execute('SELECT id FROM Course WHERE title = ? ', (title, ))#this line
course_id = cur.fetchone()[0]
cur.execute('''INSERT OR REPLACE INTO Member
(user_id, course_id) VALUES ( ?, ? )''',
( user_id, course_id ) )# here is a tuple too
cur.execute('''
INSERT OR REPLACE INTO Member(user_id,course_id,role)
VALUES (?,?,?)''',(user_id,course_id,role,))
conn.commit()# this cost time, so sometimes we donnot execute this line
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/13341.html
標籤:其他數據庫
下一篇:查詢出的多條記錄合成一條記錄
