我正在尝试使用python和sqlalcehmy将内容插入数据库,但它会给我一个重复的外键错误。我以前在执行sql查询来创建表时没有遇到任何问题。
vfhzx4xs1#
您之所以得到重复的代码,是因为您将代码编写为一对一关系,而这至少是一对多关系。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-many关系的原因。它们需要在两个表中,一个表中的relationship列需要列出另一个表才能工作,如您所见。最后,看看 __repr__ . 这就是orm用来为数据库生成外键的方法。这也非常重要,包括。如果没有它,你的代码要么会非常慢,要么就是无法协同工作。在sqlalchemy中生成外键有两个不同的选项。 __repr__ 以及str__repr__ 设计用于生成更易于机器读取的密钥,这将有助于提高性能,但可能会使读取和理解它们变得更加困难。 __str__ 是为人性化设计的。这会使外键更容易理解,但也会使代码运行稍微慢一点。你可以随时使用 __str__ 在开发过程中,然后切换 __repr__ 当你准备好拥有你的最终数据库时。
db.Column()
Column()
db.Relationship()
__repr__
__str__
1条答案
按热度按时间vfhzx4xs1#
您之所以得到重复的代码,是因为您将代码编写为一对一关系,而这至少是一对多关系。
sql不允许您拥有任何变量中的多个。它为每个变量创建键,当您尝试插入同一个变量,但尚未在表之间设置任何类型的关系时,它会对您感到非常不安,并抛出所得到的错误。
下面的代码是使用flask连接到数据库的表的一对多关系。。如果你自己不用 flask 。。找出翻译,或者使用它。
这里有几个不同之处需要注意。列现在是
db.Column()
不是Column()
. 这是工作中的 flask 代码。它在您的数据库和该表中的列之间建立连接,表示“嘿,这两个东西是连接的”。另外,看看
db.Relationship()
两个表中都添加了变量。这就是告诉orm这两个表有一个1-2-many关系的原因。它们需要在两个表中,一个表中的relationship列需要列出另一个表才能工作,如您所见。最后,看看
__repr__
. 这就是orm用来为数据库生成外键的方法。这也非常重要,包括。如果没有它,你的代码要么会非常慢,要么就是无法协同工作。在sqlalchemy中生成外键有两个不同的选项。__repr__
以及str
__repr__
设计用于生成更易于机器读取的密钥,这将有助于提高性能,但可能会使读取和理解它们变得更加困难。__str__
是为人性化设计的。这会使外键更容易理解,但也会使代码运行稍微慢一点。你可以随时使用__str__
在开发过程中,然后切换__repr__
当你准备好拥有你的最终数据库时。