【问题标题】:No unique constraint matching given keys for referenced table "users" (PostgreSQL)没有唯一约束匹配引用表“用户”的给定键(PostgreSQL)
【发布时间】:2017-08-26 01:25:32
【问题描述】:

所以我收到一个错误,即没有唯一约束与我的一张表的给定键匹配。我有两个表:用户和项目,其中我们有一个多对一的关系(一个用户的许多项目)。我正在使用 Flask-SQLAlchemy 来完成所有这些工作:

    class ItemModel(db.Model):
        __tablename__ = 'items'

        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(40))
        description = db.Column(db.String(80))
        price = db.Column(db.Float(precision=2))
        emailAddress = db.Column(db.String(40), db.ForeignKey('users.email'))

    class UserModel(db.Model):

        __tablename__ = 'users'

        id = db.Column(db.Integer)
        email = db.Column(db.String(40), primary_key=True)
        name = db.Column(db.String(40))
        last_name = db.Column(db.String(40))

        items = db.relationship('ItemModel', lazy="dynamic")

要创建表格,我的“app.py”中有以下语句:

    @app.before_first_request
    def create_database():
        print("Creating tables.")
        db.create_all()

错误是:没有唯一约束匹配引用表用户的给定键。

我不确定我哪里出错了,因为我在 ItemModel 中有一个与 UserModel 中的主键匹配的外键。欢迎任何建议/提示!

谢谢。

【问题讨论】:

  • 你能修正最后一个代码create_database()的缩进吗?还是在你的代码中是这样的?
  • 对不起,我的意思是将'def'缩进一个标签。我修好了它。我注意到的一件有趣的事情是,当我删除了“UserModel”中的“电子邮件”之外的所有内容时。它工作得很好,所以我正在尝试解决这个问题。
  • 不使用 Flask-SQLAlchemy,但在 SQL 中,您必须先创建表 users - 然后才能创建另一个具有引用它的 FK 约束的表。
  • @ErwinBrandstetter 是的,这实际上是一个问题 - 我添加了外键关系,但是通过 Heroku 运行它(它没有设置这些关系)所以一旦我设置了这些关系并销毁了表,一切开始工作。感谢您的帮助!

标签: python sql postgresql flask-sqlalchemy


【解决方案1】:

实际上,我得到了这个工作 - 正如 Erwin Brandstetter 上面提到的,发生错误是因为您需要先创建用户表。就我而言,我需要根据 Postgres 本身的外键/主键关系来更新用户表。

【讨论】:

  • 您可以接受自己的答案,因此案件已结案。
【解决方案2】:

为了那些最终在这里但他们以不同方式构建代码的人,假设每个实体都在它自己的文件中,请在调用 .create_all() 方法之前检查您的导入顺序。

【讨论】:

    【解决方案3】:

    我想通过以下方式解决您遇到的餐桌订购问题:

    table_names = ['users',
                   'items']
    
    for table in table_names:
        t = db.Model.metadata.tables[table]
        t.create(bind=engine)
    

    【讨论】:

      猜你喜欢
      • 2016-08-13
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      相关资源
      最近更新 更多