首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法组合映射表的任何主键列

无法组合映射表的任何主键列
EN

Stack Overflow用户
提问于 2014-07-22 02:53:15
回答 5查看 61.8K关注 0票数 61

当我试图创建一个数据库模式迁移时,我得到了这个奇怪的错误。你能帮我找出出了什么问题吗?

代码语言:javascript
复制
$ python app.py db upgrade
[skipped]
sqlalchemy.exc.ArgumentError: Mapper Mapper|EssayStateAssociations|essay_associations could not assemble any primary key columns for mapped table 'essay_associations'

我的模型:

代码语言:javascript
复制
class EssayStateAssociations(db.Model):
    __tablename__ = 'essay_associations'

    application_essay_id = db.Column(
        db.Integer,
        db.ForeignKey("application_essay.id"),
        primary_key=True),
    theme_essay_id = db.Column(
        db.Integer,
        db.ForeignKey("theme_essay.id"),
        primary_key=True),
    state = db.Column(db.String, default="pending")
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-09-25 11:09:01

一个表中不能有两个主键。相反,您必须使用复合主键。这可以通过在模型中添加PrimaryKeyConstraint来完成,如下所示(请记住在__table_args__中的括号之前添加逗号

代码语言:javascript
复制
from db import PrimaryKeyConstraint

class EssayStateAssociations(db.Model):
    __tablename__ = 'essay_associations'
    __table_args__ = (
        PrimaryKeyConstraint('application_essay_id', 'theme_essay_id'),
    )

    application_essay_id = db.Column(
        db.Integer,
        db.ForeignKey("application_essay.id"))
    theme_essay_id = db.Column(
        db.Integer,
        db.ForeignKey("theme_essay.id"))
    state = db.Column(db.String, default="pending")
票数 43
EN

Stack Overflow用户

发布于 2018-04-15 22:15:23

之所以会出现这个错误,是因为Column()定义后面有逗号,这会导致application_essay_idtheme_essay_id被解析为包含Column的单元素元组,而不仅仅是Column。这会阻止SQLAlchemy“看到”列的存在,从而导致您的模型不包含任何主键列。

如果您只是简单地替换

代码语言:javascript
复制
application_essay_id = db.Column(
    db.Integer,
    db.ForeignKey("application_essay.id"),
    primary_key=True),
theme_essay_id = db.Column(
    db.Integer,
    db.ForeignKey("theme_essay.id"),
    primary_key=True),

使用

代码语言:javascript
复制
application_essay_id = db.Column(
    db.Integer,
    db.ForeignKey("application_essay.id"),
    primary_key=True)
theme_essay_id = db.Column(
    db.Integer,
    db.ForeignKey("theme_essay.id"),
    primary_key=True)

那么你的错误就会被修复。

旁白:由于SQLAlchemy (以及Alembic和Flask-SQLAlchemy)包含一些用于声明模型/表的语法,这些语法涉及将逗号分隔的Column序列作为参数传递(例如,传递给op.create_table()Table()构造函数),而其他语法涉及将带有Column的类声明作为类属性,因此通过将Column声明从第一个语法剪切并粘贴到第二个语法并忘记删除一些逗号,很容易遇到这个错误。我怀疑这个容易犯的错误就是这个问题有如此多的浏览量的原因--在我发布这个答案的时候超过了16000。

票数 66
EN

Stack Overflow用户

发布于 2021-11-27 03:09:39

尽管上面已经给出了很好的答案,但人们可能犯的一个小错误是创建了一个没有任何主键的表。尽管看起来没有必要,但需要为每个表创建一个主键。否则会抛出上面的错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24872541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档