答案 0 :(得分:1)
之所以得到副本,是因为您已将代码以至少一对多的关系一对一地编写。
Sql不允许您拥有多个变量中的一个以上。它会为每个变量创建键,当您尝试插入相同的变量,但尚未在表之间建立任何类型的关系时,它会让您非常不高兴,并抛出您所得到的错误。
下面的代码是使用flask连接到数据库的表的一对多关系..如果您自己不是使用flask ..找出翻译或使用它。
class ChildcareUnit(db.Model):
Childcare_id=db.Column('ChildcareUnit_id',db.Integer,primary_key=True)
fullname = db.Column(String(250), nullable = False)
shortname = db.Column(String(250), nullable = False)
_Menu = db.relationship('Menu')
def __init__(self,fullname,shortname):
self.fullname = fullname
self.shortname = shortname
def __repr__(self):
return '<ChildcareUnit %r>' % self.id
class Menu(db.Model):
menu_id = db.Column('menu_id', db.Integer, primary_key=True)
menu_date = db.Column('Date', Date, nullable=True)
idChildcareUnit=db.Column(db.Integer,db.Forgeinkey('ChilecareUnit.ChilecareUnit_id'))
ChilecareUnits = db.relationship('ChildcareUnit')
def __init__(self,menu_date):
self.menu_date = menu_date
def __repr__(self):
return '<Menu %r>' % self.id
这里要注意几个区别。列现在为db.Column()
而不是Column()
。这是工作中的Flask代码。它会在您的数据库和该表中的列之间建立连接,并说“嘿,这两件事已连接”。
此外,请查看我已添加到两个表中的db.Relationship()
变量。这就是告诉您的ORM这两个表具有1-2-许多关系的原因。如您所见,它们必须位于两个表中,并且一个表中的关系列需要列出另一个表才能起作用。
最后,请看__repr__
。这就是您ORM用来为数据库生成外键的方式。包括在内也非常重要。如果没有它,您的代码将非常慢,或者无法一起工作。
在sqlalchemy中必须有两个不同的选项来生成外键。 __repr__
和__str__
__repr__
旨在生成使机器更易于阅读的键,这有助于提高性能,但可能会使阅读和理解它们更加困难。
__str__
被设计为对人类友好的。这将使您的外键更易于理解,但也会使您的代码运行速度稍慢。
在开发过程中,您始终可以使用__str__
,然后在准备好拥有最终数据库时切换__repr__
。