Using foreign keys in sqlite3 for Python

天大地大妈咪最大 提交于 2020-02-01 02:49:17

问题


I'm writing a program that creates a sqlite3 database through python. I have one table of Authors (AuthorID, Name) and a second table of books (BookID, Title, AuthorID) I've created these as shown below:

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

I then go to add a record to each of the tables as shown below:

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

The database is correctly updated but I don't think the foreign keys are working correctly because it allows me to remove the Author 'Jane Austin', when there are books associated with it.

I've seen some tutorials use this line:

Books.execute("PRAGMA foreign_keys = 1")

Is this the answer to the problem and if so where do I put this line?


回答1:


The PRAGMA foreign_keys setting applies to a connection, so you should execute it immediately after calling sqlite3.connect().

Please note that foreign key constraints work only inside the same database; you should put both tables into the same file.




回答2:


So to do what you want to do you need to create one database file with 2 tables.

Example:

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

Note that both tables are in the same database and you add the line after connection and before the cursor object.

Hope this helps.



来源:https://stackoverflow.com/questions/29420910/using-foreign-keys-in-sqlite3-for-python

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!