我正在编写一个通过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")
这是问题的答案吗?如果是,我该把这条线放在哪里?
PRAGMA foreign_keys
设置适用于连接,因此您应该在调用sqlite3.connect()
后立即执行它。
请注意,外键约束仅在同一数据库内有效;您应该将两个表放入同一个文件中。
因此,要做你想做的事情,你需要创建一个包含 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()
请注意,两个表都位于同一数据库中,并且您在连接之后、游标对象之前添加了该行。
希望这有帮助。
仅供参考,根据最近的官方文档,你可以使用
PRAGMA foreign_keys = ON
。
connection = sqlite3.connect(DB_FILE)
connection.execute('PRAGMA foreign_keys = ON')
cursor = connection.cursor()
(...)
另请注意,如果存在活动交易,则
PRAGMA foreign_keys
不起作用。如果您尝试这样做,不会出现错误消息,但外键仍然会被关闭。
如果即使在使用编译指示后仍遇到外键问题,则在使用它之前尝试执行一次
COMMIT
可能值得。