在sqlite3 for Python中使用外键

i86rm4rw  于 2022-12-29  发布在  SQLite
关注(0)|答案(4)|浏览(277)

我正在写一个程序,通过python创建一个sqlite3数据库,我有一个Authors表(AuthorID,Name)和第二个books表(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()

数据库正确更新,但我不认为外键工作正常,因为它允许我删除作者'简奥斯汀',当有书籍与它相关联。
我看过一些教程使用这一行:

Books.execute("PRAGMA foreign_keys = 1")

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

gv8xihay

gv8xihay1#

PRAGMA foreign_keys设置应用于连接,因此您应该在调用sqlite3.connect()之后立即执行它。
请注意,外键约束仅在同一数据库内有效;应该将两个表放入同一个文件中。

xtfmy6hx

xtfmy6hx2#

因此,要做你想做的事情,你需要创建一个数据库文件与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()

请注意,这两个表位于同一数据库中,您可以在connection之后和cursor对象之前添加该行。
希望这个有用。

ha5z0ras

ha5z0ras3#

还要注意,如果有活动事务,PRAGMA foreign_keys将不起作用。如果您尝试这样做,将不会出现错误消息,但外键仍将被关闭。
如果即使在使用杂注之后仍遇到外键问题,那么在使用COMMIT之前尝试执行一次它可能是值得的。

ukdjmx9f

ukdjmx9f4#

仅供参考,根据最近的官方文件,您可以使用**PRAGMA foreign_keys = ON**。

connection = sqlite3.connect(DB_FILE)
connection.execute('PRAGMA foreign_keys = ON')
cursor = connection.cursor()
(...)

相关问题