2013-05-07 62 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