2013-05-07 3 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 = о, и он вернулся через 1. Я создал эту базу данных с питоном, и я использовал программу просмотра базы данных для проверки полей. Он показывал все правильное от первичных ключей, до текстовых полей, но не внешнего ключа. Он отображает 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

Все в ваших описаниях звучит правильно. Твои чувства ошибаются. Что вы на самом деле хотите сделать? –

+0

Я хочу создать пользователей таблицы (имя, адрес электронной почты, пароль) и сообщения (body, userid). Затем я хочу получить из базы данных, сообщение и кто сделал сообщение. Чем я хочу отобразить это в html для удобства чтения. Я думаю, что я правильно понимаю концепцию таблицы, но я мог быть совершенно неправ. Я подумал, что так поступают и другие. Я хочу, чтобы внешний ключ автоматически обновлялся при обновлении таблицы пользователей. Я попробовал «на каскаде обновления», но это не помогло. – gallly

+0

Не могли бы вы показать конкретный пример обновления, которое должно быть распространено? –

ответ

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

Смежные вопросы