我已经规范化了三个表(Product,ProductType和ProductGender),我希望在我的主程序中调用它们,以便用户可以成功输入值并将数据存储在正确的表中。
以下是正在创建的 SQL 表
def create_product_table():
sql = """create table Product
(ProductID integer,
Name text,
primary key(ProductID))"""
create_table(db_name, "Product", sql)
def create_product_type_table():
sql = """create table ProductType
(ProductID integer,
Colour text,
Size text,
Gender text,
AmountInStock integer,
Source text,
primary key(ProductID, Colour, Size, Gender)
foreign key(Gender) references ProductGender(Gender)
foreign key(ProductID) references Product(ProductID))"""
create_table(db_name, "ProductType", sql)
def create_product_gender_table():
sql = """create table ProductGender
(Gender text,
Price text,
primary key(Gender))"""
create_table(db_name, "ProductGender", sql)
以下是 SQL 子例程
def insert_data(values):
with sqlite3.connect("jam_stock.db") as db:
cursor = db.cursor()
sql = "insert into Product (Name, ProductID) values (?,?)"
cursor.execute(sql,values)
db.commit()
def insert_product_type_data(records):
sql = "insert into ProductType(Amount, Size, Colour, Source) values (?,?,?,?)"
for record in records:
query(sql,record)
def insert_product_gender_data(records):
sql = "insert into ProductGender(Gender, Price) values (?,?)"
for record in records:
query(sql, records)
def query(sql,data): #important
with sqlite3.connect("jam_stock.db") as db:
cursor = db.cursor()
cursor.execute("PRAGMA foreign_keys = ON") #referential integrity
cursor.execute(sql,data)
db.commit()
下面是用户将在其中输入值的代码。
if ans=="1": #1=to option 'Add Stock'
a = input("Enter Gender: ")
b = float(input("Enter Price: "))
c = int(input("Enter ProductID: "))
d = input("Enter Name: ")
e = input("Enter Size: ")
f = input("Enter Colour: ")
g = input("Enter Source: ")
h = input("Enter Amount: ")
#code calling tables should be here
非常感谢帮助。严重不确定如何将 3 个表与用户的输入链接起来。
这是我在规范化数据库之前所做的。因此,"产品"中的一个表将被更新,而不是添加已经存在的产品。显然,现在情况发生了变化,因为我创建了两个新表,但我无法成功添加产品,更不用说编辑一个了。
def update_product(data): #subroutine for editing stock
with sqlite3.connect("jam_stock.db") as db:
cursor = db.cursor()
sql = "update Product set Name=?, Price=?, Amount=?, Size=?, Colour=?, Source=?, Gender=? where ProductID=?"
cursor.execute(sql,data)
db.commit()
给定上面显示的代码,并假设(BIG 假设,请参阅后面!)用户从不输入现有记录的数据,以下代码应该这样做:
query('insert into Product (Name, ProductID) values (?,?)',
[d, c])
query('insert into ProductGender (Gender, Price) values (?,?)',
[a, b])
query('insert into ProductType (ProductID, Colour, Size, Gender, '
AmountInStock, Source) values (?,?,?,?,?,?)',
[c, f, e, a, h, g])
当然,您使用任意的单字母变量名称使其很难理解,但我认为我的对应关系是正确的:-)。
更重要的是,如果用户在三个表中的一个或多个表中输入现有记录的数据(由各自的主键确定),您永远不会告诉我们该怎么做。
例如,如果Product
已经有一条ProductID
为 foobar
且Name
为 Charlemagne
的记录;并且用户输入 ProductID
作为 foobar
和Name
Alexandre
;在这种情况下您希望发生什么? 你从来不告诉我们!
我上面介绍的代码将使整个序列失败,因为尝试使用已经存在的主键插入Product
新记录;如果您没有捕获异常并打印错误消息,这实际上会使整个程序崩溃。
但也许你想在这种情况下做一些完全不同的事情——而且有很多可能性,我们不能盲目猜测!
因此,请编辑您的 Q 以详细说明在一个或多个表中主键"重复"的每种情况下应该发生什么(除非你在这种情况下崩溃!-),以及 SQL 和 Python 代码来准确无误地发生这种情况。 但是,当然,我们无法决定您的程序的语义是什么...!-)