Flask插入数据遇意外关键字参数及数据库迁移异常
Flask Payments表问题解决方案
1. 解决TypeError: __init__() got an unexpected keyword argument 'orderid'
你的Payments类自定义了__init__方法,但该方法未接收orderid参数,同时存在其他隐患:
- 模型中的
orderid、amount_usd、merchant_amount都是非空字段,但__init__里未对其赋值,写入数据库会触发约束错误 __init__里直接使用response["address"],但response并未作为参数传入,会引发NameError- 实例化时传入了
wallet参数,但__init__未接收该参数
两种修复方式:
方式一:完善__init__方法
def __init__(self, orderid, userid, amount, amount_usd, merchant_amount, currency, status, wallet): self.orderid = orderid self.userid = userid self.amount = amount self.amount_usd = amount_usd self.merchant_amount = merchant_amount self.currency = currency self.status = status self.wallet = wallet self.created_on = datetime.now()
实例化时需确保传入所有必填参数。
方式二:删除自定义__init__方法
SQLAlchemy会自动生成支持所有字段关键字参数的默认构造方法,这样你现有的实例化代码Payments(orderid=orderid, ...)可直接运行,还能避免手动维护__init__的麻烦。
2. 解决数据库迁移异常问题
问题根源:
你在代码末尾使用db.create_all()直接创建表,与Flask-Migrate的迁移机制冲突:
flask db edit看不到Payments表,是因为迁移脚本未记录该表的创建(表被db.create_all()直接生成)flask db upgrade提示“users表已存在”,是因为db.create_all()已提前创建users表,迁移脚本尝试重复创建
修复步骤:
- 移除手动创建表的代码
删除文件末尾这段代码:
with app.app_context(): db.create_all() db.session.commit()
迁移工具会全权负责表的创建和更新,无需手动调用db.create_all()。
- 重置迁移记录(若之前迁移已混乱)
- 先备份数据库文件,避免数据丢失
- 删除项目中的
migrations文件夹 - 重新初始化迁移:
flask db init flask db migrate -m "add Payments table and initial models" - 打开生成的迁移脚本,删除创建
users表的代码块(因users表已存在),仅保留Payments表的创建逻辑 - 执行升级:
flask db upgrade
- 验证
现在执行flask db edit即可看到包含Payments表的迁移脚本,后续模型变更只需使用flask db migrate和flask db upgrade。
内容的提问来源于stack exchange,提问作者Tom John
相关产品推荐
相关产品推荐

