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 字段时,它返回“无”。我究竟做错了什么?

编辑:这是我如何让它工作的

@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'))
4

1 回答 1

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()
    ...

(您真的想为每个帖子创建一个新用户吗?)

于 2013-05-08T18:31:41.693 回答