【问题标题】:Why am I getting a duplicate foreign key error?为什么我收到重复的外键错误?
【发布时间】:2019-05-06 02:54:36
【问题描述】:

我正在尝试使用 Python 和 SQLAlcehmy 将内容插入数据库,但它给了我一个重复的外键错误。我之前执行 SQL 查询以创建表时没有任何问题。

【问题讨论】:

  • 将代码/错误作为图像发布会使人们更难提供帮助。请编辑您的问题并将所有项目以纯文本形式发布。

标签: python mysql sql database sqlalchemy


【解决方案1】:

您得到了重复,因为您将代码编写为一对一的关系,而实际上它至少是一对多的关系。

Sql 不允许您拥有多个变量。它为每个变量创建键,当您尝试插入相同的变量,但没有在表之间建立任何类型的关系时,它会让您非常沮丧,并引发您遇到的错误。

以下代码是您的表的一对多关系,使用烧瓶连接到数据库。如果您自己不使用烧瓶..弄清楚翻译,或者使用它。

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 关系的原因。它们需要在两个表中,并且一个表中的关系列需要列出另一个表才能工作,如您所见。

最后,看看__repr__。这就是你的 ORM 用来为你的数据库生成外键的东西。包括在内也很重要。没有它,你的代码要么超级慢,要么不能一起工作。 在 sqlalchemy 中生成外键有两个不同的选项。 __repr____str__

__repr__ 旨在生成更易于机器读取的密钥,这将有助于提高性能,但可能会使阅读和理解它们变得更加困难。 __str__ 旨在人性化。它会让你的外键更容易理解,但它也会让你的代码运行得慢一点。 您可以在开发时始终使用__str__,然后在准备好拥有最终数据库时切换__repr__

【讨论】:

  • 嗨,我们没有使用 Flask 代码。有没有其他方法可以做到这一点
  • 有。 SqlAlchemy 有一种方法可以创建一个引擎供您连接,还有 pyodbc,我敢肯定至少有 2 或 3 个其他方法。如果您不想使用flask,则必须通读文档以了解如何使上述代码工作。切换它应该不难。只需 google/youtube 即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-19
  • 2020-09-17
  • 1970-01-01
  • 2012-09-15
相关资源
最近更新 更多