Flask-SQLAlchemy无法创建表及外键:类名与表名是否为问题根源?
问题解答:类名与表名不匹配不是你当前问题的原因
首先直接给结论:不会,你设置了__tablename__的情况下,类名和表名是否匹配完全不影响SQLAlchemy生成表。SQLAlchemy会优先使用你显式定义的__tablename__值,不管你的类叫什么名字,所以这一点不是导致表无法生成的原因。
那你的问题大概率出在这几个地方:
外键引用的表名错误:你看Pet模型里的外键写的是
db.ForeignKey('person.id'),但Person类的表名是persons(通过__tablename__指定的)。SQLAlchemy在外键里引用的是数据库表名,不是类名,所以这里应该改成db.ForeignKey('persons.id')。这个错误会导致数据库引擎找不到关联的表,从而创建表失败。没有执行建表命令:如果用的是Flask-SQLAlchemy,你需要在应用上下文里调用
db.create_all()来生成表;如果用了Flask-Migrate做迁移,得依次执行flask db init、flask db migrate、flask db upgrade这几个命令,不然表不会自动生成。模型未被正确导入:如果你的模型文件没有被主应用代码导入,SQLAlchemy根本不知道这些模型的存在,自然不会去创建对应的表。要确保在初始化db对象之后,或者在启动应用前,模型已经被加载。
数据库连接配置问题:比如你的数据库URL配置错误,连接到了一个不存在的数据库,或者数据库用户没有创建表的权限,也会导致表生成失败。
先把外键的错误修正,再检查一下建表步骤和导入情况,应该就能解决问题了。
内容的提问来源于stack exchange,提问作者kmg92




