2016-11-23 3 views
0

У меня возникли проблемы с моим пониманием того, как внешние ключи работают в sqlite3.Внешние ключи Sqlite3 Python3

Я пытаюсь получить идентификатор пользователя (james) в одной таблице, чтобы он отображался как внешний ключ в моей таблице других товаров. Но когда я запрашиваю, он возвращает None.

До сих пор я пытался:

  1. Включение внешнего ключа поддержки
  2. Переписывая тестовый сценарий (который обсуждается здесь), чтобы изолировать Issue
  3. Я переписан код, после обнаружения проблем в том, как я изначально написал его
  4. После некоторых исследований я столкнулся с объединениями, но я не думаю, что это решение, поскольку мой текущий запрос является альтернативой объединениям, насколько мне известно

Код

импорт sqlite3 в кв

класс DATAB:

def __init__(self): 

    self.conn = sq.connect("Atest.db") 
    self.conn.execute("pragma foreign_keys") 
    self.c = self.conn.cursor() 
    self.createtable() 
    self.defaultdata() 
    self.show_details() # NOTE DEFAULT DATA ALREADY RAN 

def createtable(self): 
    self.c.execute("CREATE TABLE IF NOT EXISTS userstuff(" 

        "userid TEXT NOT NULL PRIMARY KEY," 
        " password TEXT)") 

    self.c.execute("CREATE TABLE IF NOT EXISTS otherstuff(" 

        "anotherid TEXT NOT NULL PRIMARY KEY," 
        "password TEXT," 
        "user_id TEXT REFERENCES userstuff(userid))") 

def defaultdata(self): 
    self.c.execute("INSERT INTO userstuff (userid, password) VALUES (?, ?)", ('james', 'password')) 
    self.c.execute("INSERT INTO otherstuff (anotherid, password, user_id) VALUES (?, ?, ?)",('aname', 'password', 'james')) 
    self.conn.commit() 

def show_details(self): 
    self.c.execute("SELECT user_id FROM otherstuff, userstuff WHERE userstuff.userid=james AND userstuff.userid=otherstuff.user_id") 
    print(self.c.fetchall()) 
    self.conn.commit() 

----- ПРИМЕЧАНИЕ КОД НИЖЕ ЭТО ИЗ НОВОГО ФАЙЛА ---------

import test2 as ts 



x = ts.DATAB() 

Большое спасибо

ответ

0

foreig n ключевым ограничением является то, что ограничение . Это означает, что он не позволяет вам вставлять данные, которые нарушают ограничение; в этом случае это помешает вам вставить значение non-NULL user_id, которое не существует в родительской таблице.

По умолчанию ограничения внешнего ключа допускают значения NULL. Если вы хотите предотвратить строки userstuff без родительской строки, добавьте ограничение NOT NULL в столбец user_id.

В любом случае ограничение не создает магические данные (и база данных не может знать, какой идентификатор вы хотите). Если вы хотите ссылаться на определенную строку родительской таблицы, вам нужно вставить ее идентификатор.

+0

Итак, я попытался добавить следующую строку кода self.c.execute ("INSERT INTO otherstuff (user_id) VALUES (?)", ('James')), но теперь я получил несколько ошибок привязки. Правильно ли я говорю, что проблема с моим кодом заключается в том, что мне нужно дать таблице otherstuff идентификатор james для использования в качестве внешнего ключа? – Padwas

+0

'('james')' строка с пятью элементами; одноэлементный кортеж будет '('james',)'. –

+0

Теперь после запроса данных снова я получаю sqlite3.OperationalError: no такой столбец: james, но это не должно происходить, поскольку теперь есть данные во всех столбцах. Я обновил основной код с изменениями и до сих пор не вижу своей проблемы. – Padwas

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