【问题标题】:Foreign keys Sqlite3 Python3外键 Sqlite3 Python3
【发布时间】:2016-11-23 23:53:15
【问题描述】:

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

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

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

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

代码

将 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()

非常感谢

【问题讨论】:

    标签: python-3.x sqlite


    【解决方案1】:

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

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

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

    【讨论】:

    • 所以我尝试添加以下代码行 self.c.execute("INSERT INTO otherstuff (user_id) VALUES (?)",('james')) 但我现在得到了一些绑定错误。我是否正确地说我的代码问题是我需要为其他表提供 james 的用户 ID 以用作外键?
    • ('james') 是一个包含五个元素的字符串;一个单元素元组是('james',)
    • 好的,再次查询数据后,我现在得到 sqlite3.OperationalError: no such column: james,但这不应该发生,因为现在所有列中都有数据。我用更改更新了主代码,但仍然没有看到我的问题
    • 两次 INSERT 会导致 otherstuff 表中的两行。并且错误消息不是来自您显示的任何代码。
    • 已删除表,编辑上面的代码并按原样运行,导致以下错误...sqlite3.IntegrityError:NOT NULL constraint failed:otherstuff.anotherid,但从代码中我们可以看到我将其设置为名字
    猜你喜欢
    • 2014-06-28
    • 2013-02-09
    • 2012-11-12
    • 1970-01-01
    • 2013-03-04
    • 2011-09-11
    • 2013-02-24
    • 1970-01-01
    相关资源
    最近更新 更多