Mic*_*lov 35 python sqlalchemy flask-sqlalchemy flask-migrate
当我尝试创建数据库模式迁移时,我遇到了这个奇怪的错误.你能帮我弄清楚出了什么问题吗?
$ 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'
Run Code Online (Sandbox Code Playgroud)
我的模特:
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")
Run Code Online (Sandbox Code Playgroud)
Mar*_*ery 32
因为你有你的后尾随逗号你得到这个错误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),
Run Code Online (Sandbox Code Playgroud)
同
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)
Run Code Online (Sandbox Code Playgroud)
然后你的错误将被修复.
除此之外:因为SQLAlchemy(和Alembic和Flask-SQLAlchemy)包含一些声明模型/表的语法,这些语法涉及将逗号分隔的Columns 序列作为参数传递(例如,op.create_table()或者Table()构造函数)以及其他涉及将Columns 声明为类的类通过剪切和粘贴从第一个语法到第二个语法的声明并忘记删除一些逗号,很容易遇到此错误Column.我怀疑这个容易犯的错误是这个问题有如此多的观点的原因 - 当我发布这个答案时超过16000.
Min*_*ham 31
表中不能有两个主键.相反,您必须使用复合主键.这可以通过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")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32658 次 |
| 最近记录: |