2013-05-07 75 views
0
cur.execute("CREATE TABLE users(id integer PRIMARY KEY, username TEXT, password TEXT, email TEXT)") 
    cur.execute("CREATE TABLE posts(id integer PRIMARY KEY, body TEXT, user_id int, FOREIGN KEY(user_id) REFERENCES users(id))") 

我已經啓用了pragma foreign_keys = on,並且它返回了一個1.我用python創建了這個數據庫,並且我使用了數據庫查看程序來檢查字段。它顯示了從主鍵到文本字段的所有內容,但沒有外鍵。它將user_id顯示爲int,僅此而已。插入時我也沒有得到任何價值。我覺得如果我插入一個用戶,比它應該創建一個行,並在帖子中引用。但是當我查詢user_id字段時,它返回'none'。我究竟做錯了什麼?sqlite3外鍵不工作

編輯:這裏是我如何得到它的工作

@app.route('/add', methods=['POST']) 
def add():  
    c = g.db.execute("INSERT INTO posts(body) VALUES(?)", [request.form['body']]) 
    b = g.db.execute("INSERT INTO users(username) VALUES(?)", [request.form['name']]) 
    get = g.db.execute("SELECT id from users where username=?", [request.form['name']]) 
    id = get.fetchone() 
    userid=str(id[0]) 
    bet = g.db.execute("SELECT id from posts where body=?", [request.form['body']]) 
    bid = bet.fetchone() 
    postid = str(bid[0]) 
    e = g.db.execute("UPDATE posts SET user_id = (?) where id = (?) ", [userid,postid]) 
    g.db.commit() 
    flash('subbmited') 
    return redirect(url_for('home')) 
+0

描述中的所有內容聽起來都是正確你的感覺是錯誤的。你究竟想要做什麼? – 2013-05-08 11:27:17

+0

我想創建一個表用戶(名稱,電子郵件,密碼)和帖子(body,userid)。然後我希望能夠從數據庫中檢索一篇文章以及發佈文章的人員。比我想顯示在HTML中以便於閱讀。我認爲我在做正確的觀念,但我可能完全錯誤。我認爲這也是其他人的做法。我希望外鍵在用戶表更新時自動更新。我嘗試過「更新級聯」,但沒有幫助。 – gallly 2013-05-08 16:24:04

+0

您能否展示應傳播的更新的特定示例? – 2013-05-08 16:57:49

回答

1

外鍵用於管理記錄之間的關係。 但是,在您的代碼中,您沒有告訴數據庫兩個插入的記錄以任何方式相關。

你應該插入users戰績第一,這樣就可以使用新插入的ID爲posts記錄:

def add(): 
    cursor = g.db.cursor() 
    cursor.execute("INSERT INTO users(username) VALUES(?)", [request.form['name']]) 
    g.db.execute("INSERT INTO posts(body, user_id) VALUES(?,?)", 
       [request.form['body'], cursor.lastrowid]) 
    g.db.commit() 
    ... 

(你真的想創建一個新用戶的每一個職位?)

+0

感謝您花時間幫助,真的很感激它:) – gallly 2013-05-08 22:05:25