在sqlite3中使用外键用于Python

时间:2015-04-02 19:27:24

标签: python sqlite

我正在编写一个通过python创建sqlite3数据库的程序。我有一个作者表(AuthorID,Name)和第二个书籍表(BookID,Title,AuthorID)我创建了这些表,如下所示:

Authors = sqlite3.connect('Authors.db')
Authors.execute('''CREATE TABLE Authors
       (AuthorID      INT  PRIMARY KEY, 
       Name           TEXT);''')
Authors.close()


Books = sqlite3.connect('Books.db')
Books.execute('''CREATE TABLE Books
       (BookID            INT  PRIMARY KEY, 
       Title              TEXT,
       AuthorID           INT,
       FOREIGN KEY(AuthorID) REFERENCES Authors(AuthorID));''')
Books.close()

然后我去为每个表添加一条记录,如下所示:

Authors = sqlite3.connect('Authors.db') 
Authors.execute("INSERT INTO Authors (AuthorID, Name) \
        VALUES (1, 'Jane Austin')");

Authors.commit()
Authors.close()


Books = sqlite3.connect('Books.db')
Books.execute("INSERT INTO Books (BookID, Title, AuthorID) \
        VALUES (1, 'Emma', 1)");

Books.commit()
Books.close()

数据库已正确更新,但我不认为外键工作正常,因为它允许我删除作者'Jane Austin',当有相关书籍时。

我见过一些教程使用这一行:

Books.execute("PRAGMA foreign_keys = 1")

这是问题的答案,如果是,我该把这条线放在哪里?

3 个答案:

答案 0 :(得分:10)

PRAGMA foreign_keys设置适用于连接,因此您应在调用sqlite3.connect()后立即执行此操作。

请注意,外键约束只能在同一个数据库中使用;你应该将两个表放在同一个文件中。

答案 1 :(得分:1)

要完成您想做的事情,您需要创建一个包含2个表的数据库文件。

示例:

conn=sqlite3.connect("clientdatabase.db")
conn.execute("PRAGMA foreign_keys = 1")
cur=conn.cursor()

# Create 2 tables if they don't exist: Clients and Work_Done
cur.execute('''CREATE TABLE IF NOT EXISTS Clients
(CID INTEGER PRIMARY KEY,
First_Name  TEXT    NOT NULL,
Last_Name       TEXT,
Business_Name   TEXT,
Phone           TEXT,
Address         TEXT,
City            TEXT,
Notes           TEXT,
Active_Status   TEXT    NOT NULL)''')      

cur.execute('''CREATE TABLE IF NOT EXISTS Work_Done
(ID INTEGER PRIMARY KEY,
Date            TEXT    NOT NULL,
Onsite_Contact  TEXT,
Work_Done       TEXT    NOT NULL,
Parts_Installed TEXT,
Next_Steps      TEXT,
CID             INT,
FOREIGN KEY (CID) REFERENCES CLIENTS (CID))''')
conn.commit()

请注意,两个表都在同一个数据库中,并且在连接之后和游标对象之前添加了该行。

希望这会有所帮助。

答案 2 :(得分:0)

还要注意,如果有活动的事务,则PRAGMA foreign_keys不起作用。如果尝试这样做,不会出现错误消息,但外键仍将关闭。

如果即使在使用编译指示后仍对外键有问题,可能值得尝试在使用COMMIT之前执行一次。