我在理解外键在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 回答
外键约束只是一个约束 . 这意味着它会阻止您插入违反约束的数据;在这种情况下,它会阻止您插入父表中不存在的非NULL
user_id
值 .默认情况下,外键约束允许NULL值 . 如果要在没有父行的情况下阻止
userstuff
行,请向user_id
列添加NOT NULL约束 .在任何情况下,约束都不会神奇地生成数据(并且数据库无法知道您想要的ID) . 如果要引用父表的特定行,则必须插入其ID .