为什么会出现重复的外键错误?

时间:2018-12-04 16:08:40

标签: python mysql sql database sqlalchemy

我正在尝试使用Python和SQLAlcehmy将内容插入数据库,但这给我一个重复的外键错误。在执行SQL查询以更早地创建表时,我没有任何问题。 enter image description here

working demo

1 个答案:

答案 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__