首页 文章

外键Sqlite3 Python3

提问于
浏览
1

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

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

到目前为止,我尝试过:

  • 启用外键支持

  • 重写测试脚本(此处正在讨论)以隔离问题

  • 在找到我最初编写的问题后,我重写了一些代码

  • 经过一些研究后,我遇到了加入,但我不认为这是解决方案,因为就我所知,我当前的查询是联接的替代方法

将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

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

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

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

相关问题