from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Contact(db.Model):
...
from flask import Flask
from app.models import db
def create_app():
app = Flask(__name__)
# 绑定数据库
db.init_app(app)
# 下面两种方法都可以创建数据库
db.create_all(app=app)
# with app.app_context():
# db.create_all()
return app
1
mink 2018-07-11 12:14:00 +08:00
不需要, 你在上面通过 from app.models import db 已经把模型和 db 绑定在一起了。create_app 中 db.init_app 是把 db 和当前的应用绑定在一起 只要使用 db.create_all 方法就可以调用 不需要引入模型
|
3
sevenQu OP @mink
``` import os from app import create_app,db from flask_script import Manager,Shell from flask_migrate import Migrate,MigrateCommand # from app.models.wordRepertory import CET4,CET6,Kaoyan app=create_app(os.getenv('FLASK_CONFIG') or 'default') manager=Manager(app=app) migrate=Migrate(app=app,db=db) def make_shell_context(): return dict(app=app,db=db) manager.add_command('shell',Shell(make_context=make_shell_context)) manager.add_command('db',MigrateCommand) if __name__=='__main__': manager.run() ``` 在使用 migrate 的时候,应该怎么做?我试了,如果不在上面引入 models 里定义的类,就无法迁移自动生成数据表,希望可以帮忙解决一下 |
4
mink 2018-07-11 15:14:24 +08:00
|
5
mink 2018-07-11 15:18:36 +08:00
@sevenQu flask-migrate 的 init 只是创建 migrations 的相关文件后续需要执行,migration 和 upgrade 才会记录版本和生成迁移脚本执行数据库初始化 https://juejin.im/post/5b1935355188257d492ae266
|
6
sevenQu OP @mink 会自己生成数据表的,可以完全不使用 create_all 创建。我自己试的结果是,前面需要引入 models 里的类,如果将 model 拆分,导入会很多,感觉不优雅也感觉没必要
|
8
lniwn 2018-07-11 15:47:29 +08:00
在 create_all 之前,要引入 models 文件,否则 Model 的 metadata 中没有你定义的类,你定义的表类最终会存储到 db.Model.metadata.tables 中,使用方式可以参考<https://github.com/lniwn/my_proxypool/blob/0a09c231d2f8ca7383899d8aa34153965948bd93/datacenter/datacenter.py#L38>。
这样不可避免的会导致循环引用的问题,一个比较好的解决方法是使用 import_string 来动态导入,这个方法在 werkzeug 中,我自己也参考着实现了一个<https://github.com/lniwn/my_proxypool/blob/0a09c231d2f8ca7383899d8aa34153965948bd93/datautil/generalutils.py#L8> |
9
sevenQu OP @lniwn 这段获取 db.Model.metadata.tables 里的表类的代码在 create_all()方法的源码里有,所以确实不需要引入 models 里的类
|
10
sevenQu OP @lniwn 好像我错了,是需要导入 models 的,导入的话,还有几个问题,希望您可以帮忙看看,我把代码放到了 github,问题在 readme.md ,十分希望您可以帮忙解释一下,谢谢,https://github.com/seven-share/flaskMigrateTry
|
11
sevenQu OP @mink 老铁,我又试了一下,发现不引入 models 是不能创建数据表的,希望您能看看我的源代码,看看是不是确实需要引入,同时我还有几个新问题写在了 github 的 readme 里,方便的话,希望您可以帮忙解决一下,十分感谢,https://github.com/seven-share/flaskMigrateTry
|
12
greyli 2018-07-17 19:53:47 +08:00
在知乎写了一个同一问题的回答,供需要的人参考:
https://www.zhihu.com/question/284904297/answer/444926077 |