当我试图创建一个数据库模式迁移时,我得到了这个奇怪的错误。你能帮我找出出了什么问题吗?
$ 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'
我的模型:
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")
发布于 2014-09-25 11:09:01
一个表中不能有两个主键。相反,您必须使用复合主键。这可以通过在模型中添加PrimaryKeyConstraint
来完成,如下所示(请记住在__table_args__
中的括号之前添加逗号
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")
发布于 2018-04-15 22:15:23
之所以会出现这个错误,是因为Column()
定义后面有逗号,这会导致application_essay_id
和theme_essay_id
被解析为包含Column
的单元素元组,而不仅仅是Column
。这会阻止SQLAlchemy“看到”列的存在,从而导致您的模型不包含任何主键列。
如果您只是简单地替换
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),
使用
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。
发布于 2021-11-27 03:09:39
尽管上面已经给出了很好的答案,但人们可能犯的一个小错误是创建了一个没有任何主键的表。尽管看起来没有必要,但需要为每个表创建一个主键。否则会抛出上面的错误。
https://stackoverflow.com/questions/24872541
复制相似问题