外键Sqlite3 Python3

时间:2016-11-23 23:53:15

标签: python-3.x sqlite

我在理解外键在sqlite3中的工作方式时遇到了一些麻烦。

我试图让一个表userstuff中的userid(james)在我的otherstuff表中显示为外键。然而,当我查询它时返回None。

到目前为止,我已经尝试过:

  1. 启用外键支持
  2. 重写测试脚本(此处讨论)以隔离问题
  3. 在找到我最初编写的问题之后,我重新编写了一些代码
  4. 经过一些研究后,我遇到了加入,但我不认为这是解决方案,因为据我所知,我当前的查询是联接的替代方法
  5. 代码

    将sqlite3导入为sq

    班级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()
    

    非常感谢

1 个答案:

答案 0 :(得分:0)

外键约束只是一个约束。 这意味着它会阻止您插入违反约束的数据;在这种情况下,它会阻止您插入父表中不存在的非NULL user_id值。

默认情况下,外键约束允许NULL值。如果要在没有父行的情况下阻止userstuff行,请在user_id列中添加NOT NULL约束。

在任何情况下,约束都不会神奇地生成数据(并且数据库无法知道您想要的ID)。如果要引用父表的特定行,则必须插入其ID。