我正在为一个学校项目制作一个图书馆系统,我在我的系统中插入新书并且每个表中的主键(这是其他表的外键)同时更新时遇到问题,我的数据库表如下:
CREATE TABLE `authorTable` (
`authorID` INTEGER PRIMARY KEY AUTOINCREMENT,
`firstName` TEXT,
`lastName` TEXT
);
CREATE TABLE `bookInfo` (
`infoID` INTEGER PRIMARY KEY AUTOINCREMENT,
`title` TEXT,
`description` TEXT,
`authorID` INTEGER,
FOREIGN KEY(`authorID`) REFERENCES `authorTable`(`authorID`)
);
CREATE TABLE `isbnInfo` (
`isbn` INTEGER,
`infoID` INTEGER,
PRIMARY KEY(`isbn`),
FOREIGN KEY(`infoID`) REFERENCES `bookInfo`(`infoID`)
);
CREATE TABLE `bookTable` (
`bookID` INTEGER PRIMARY KEY AUTOINCREMENT,
`available` INTEGER,
`isbn` INTEGER,
FOREIGN KEY(`isbn`) REFERENCES `isbnInfo`(`isbn`)
);
目前我完全迷失了,不知道如何开始做这项工作,我目前的代码是:
def addBook(self, bookTitle, bookDesc, bookAuthorFirstName, bookAuthorLastName, bookISBN, add_book_window, aor_window):
bookTitle = bookTitle.get()
bookDesc = bookDesc.get()
bookAuthorFirstName = bookAuthorFirstName.get()
bookAuthorLastName = bookAuthorLastName.get()
bookISBN = bookISBN.get()
if len(bookTitle) == 0:
messagebox.showinfo("Error", "Enter Book Title")
elif len(bookDesc) == 0:
messagebox.showinfo("Error", "Enter Book Description")
elif len(bookAuthorFirstName) == 0:
messagebox.showinfo("Error", "Enter Book Author's First Name")
elif len(bookAuthorLastName) == 0:
messagebox.showinfo("Error", "Enter Book Author's Last Name")
elif len(bookISBN) == 0:
messagebox.showinfo("Error", "Enter Book ISBN")
else:
try:
bookISBN = int(bookISBN)
except:
messagebox.showinfo("Error", "ISBN must be all numbers!")
with sqlite3.connect("library.db") as db:
cursor = db.cursor()
我在Python中使用Tkinter,上面函数中使用的参数来自:
### ADD BOOK CONTENT (for add_book) add_book_window
bookTitle = StringVar()
bookDesc = StringVar()
bookAuthorFirstName = StringVar()
bookAuthorLastName = StringVar()
bookISBN = StringVar()
Label(add_book_window, text='Book Title: ', bg = self.bgc, fg = "grey", font = "Arial").place(x=315, y=217)
Label(add_book_window, text='Book Description: ', bg = self.bgc, fg = "grey", font = "Arial").place(x=315, y=237)
Label(add_book_window, text='Author First Name: ', bg = self.bgc, fg = "grey", font = "Arial").place(x=315, y=257)
Label(add_book_window, text='Author Last Name: ', bg = self.bgc, fg = "grey", font = "Arial").place(x=315, y=277)
Label(add_book_window, text='ISBN: ', bg = self.bgc, fg = "grey", font = "Arial").place(x=315, y=297)
Entry(add_book_window, textvariable = bookTitle, bg = 'light grey').place(x=450, y=220)
Entry(add_book_window, textvariable = bookDesc, bg = 'light grey').place(x=450, y=240)
Entry(add_book_window, textvariable = bookAuthorFirstName, bg = 'light grey').place(x=450, y=260)
Entry(add_book_window, textvariable = bookAuthorLastName, bg = 'light grey').place(x=450, y=280)
Entry(add_book_window, textvariable = bookISBN, bg = 'light grey').place(x=450, y=300)
Entry(edit_account_window, textvariable = bookTitle, bg = 'light grey').place(x=450, y=220)
Entry(edit_account_window, textvariable = bookDesc, bg = 'light grey').place(x=450, y=240)
Entry(edit_account_window, textvariable = bookAuthorFirstName, bg = 'light grey').place(x=450, y=260)
Entry(edit_account_window, textvariable = bookAuthorLastName, bg = 'light grey').place(x=450, y=260)
Entry(edit_account_window, textvariable = bookISBN, bg = 'light grey').place(x=450, y=280)
addBook = Button(add_book_window, text='Add Book', width = 11, command=lambda:self.addBook(bookTitle, bookDesc, bookAuthorFirstName, bookAuthorLastName, bookISBN, add_book_window, aor_window)) # ADDS BOOK TO LIST
addBook.place(x=468, y=325)
帮助我的功能看起来会很棒!不确定如何使用SQL查询使一切正常工作并向数据库添加新书,以便它一次更新所有表。
如果已经有一本书的作者名称和姓氏与作者表中的作者名称和姓氏相匹配,则保留相同的作者ID并更新其他部分,如果我添加了带有ISBN的书籍已经在isbn表中匹配具有相同ISBN的书的那个,使用相同的bookInfo,authorInfo和isbn信息,并且只更新bookTable(其中每个单独的书(即使有相同书籍的x量)也列在其中独特的bookID)。