SQLAlchemy 无效的外键与 PostgreSQL 但不是 SQLite
SQLAlchemy Invalid Foreign Key with PostgreSQL but not SQLite
我可以在 SQLite 数据库中创建以下 tables:
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
class Paragraph(db.Model):
article_id = db.Column(db.ForeignKey('article.id'), primary_key=True)
index = db.Column(db.Integer, primary_key=True)
class Summary(db.Model):
article_id = db.Column(db.ForeignKey('article.id'), primary_key=True)
paragraph_index = db.Column(db.ForeignKey('paragraph.index'), primary_key=True)
level = db.Column(db.Integer, primary_key=True)
但是,当我在 PostgreSQL 中创建相同的 tables 时,出现以下错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.InvalidForeignKey) there is no unique constraint matching given keys for referenced table "paragraph"
删除 Summary.paragraph_index
允许我创建 table,所以看来问题出在这里。但是,列确实引用了一个主键,我觉得应该满足要求。
将 unique=True
添加到 Paragraph.index
还允许我创建 table。然后我可以使用 pgAdmin 删除唯一约束并让一切正常工作。然而,这似乎不妥。
我也试过:
- 通过 ORM 声明关系
- 在摘要中声明 ForeignKeyConstraint table args
- 在第 table 段参数中为主键列声明 UniqueConstraint
为了回应 Adrian Klaver 的评论,对此我表示感谢,我使用 __table_args__
将 Summary
指向 [=13] 上复合主键的两半=]:
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
class Paragraph(db.Model):
article_id = db.Column(db.ForeignKey('article.id'), primary_key=True)
index = db.Column(db.Integer, primary_key=True)
class Summary(db.Model):
article_id = db.Column(db.ForeignKey('article.id'), primary_key=True)
paragraph_index = db.Column(db.Integer, primary_key=True)
level = db.Column(db.Integer, primary_key=True)
__table_args__ = (db.ForeignKeyConstraint(
['article_id', 'paragraph_index'],
['paragraph.article_id', 'paragraph.index']),)
我可以在 SQLite 数据库中创建以下 tables:
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
class Paragraph(db.Model):
article_id = db.Column(db.ForeignKey('article.id'), primary_key=True)
index = db.Column(db.Integer, primary_key=True)
class Summary(db.Model):
article_id = db.Column(db.ForeignKey('article.id'), primary_key=True)
paragraph_index = db.Column(db.ForeignKey('paragraph.index'), primary_key=True)
level = db.Column(db.Integer, primary_key=True)
但是,当我在 PostgreSQL 中创建相同的 tables 时,出现以下错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.InvalidForeignKey) there is no unique constraint matching given keys for referenced table "paragraph"
删除 Summary.paragraph_index
允许我创建 table,所以看来问题出在这里。但是,列确实引用了一个主键,我觉得应该满足要求。
将 unique=True
添加到 Paragraph.index
还允许我创建 table。然后我可以使用 pgAdmin 删除唯一约束并让一切正常工作。然而,这似乎不妥。
我也试过:
- 通过 ORM 声明关系
- 在摘要中声明 ForeignKeyConstraint table args
- 在第 table 段参数中为主键列声明 UniqueConstraint
为了回应 Adrian Klaver 的评论,对此我表示感谢,我使用 __table_args__
将 Summary
指向 [=13] 上复合主键的两半=]:
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
class Paragraph(db.Model):
article_id = db.Column(db.ForeignKey('article.id'), primary_key=True)
index = db.Column(db.Integer, primary_key=True)
class Summary(db.Model):
article_id = db.Column(db.ForeignKey('article.id'), primary_key=True)
paragraph_index = db.Column(db.Integer, primary_key=True)
level = db.Column(db.Integer, primary_key=True)
__table_args__ = (db.ForeignKeyConstraint(
['article_id', 'paragraph_index'],
['paragraph.article_id', 'paragraph.index']),)