我想使用Flask-Migrate并查看他们的示例:
from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy from flask.ext.script import Manager from flask.ext.migrate import Migrate, MigrateCommand app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db' db = SQLAlchemy(app) migrate = Migrate(app, db) manager = Manager(app) manager.add_command('db', MigrateCommand) class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(128)) if __name__ == '__main__': manager.run()
这作为一个简单的播放示例很有用,但我有多个模型,我不想在这个脚本和定义我的应用程序代码的模型中定义模型.因此,我想将它们拉入我可以在两者之间共享的模型文件中.
我尝试通过将User
类放入a models.py
然后从那里导入User来尝试这样做.不幸的是,这会抛出一个NameError: name 'db' is not defined
.
我的问题是:
我需要db = SQLAlchemy(app)
在my models.py
中使用吗?如果是这样,我的迁移脚本和烧瓶应用程序本身都可以使用吗?
如果我不能(或不应该)将其放入models.py
,我如何在不通过db
所有文件的情况下在自己的文件中使用我的模型?
Miguel.. 17
将这么小的应用程序分区到模块中是很棘手的,因为您发现很多情况下您创建的两个模块需要相互导入,从而创建循环依赖项.
我建议你看一下如何使用app工厂函数和所有扩展的延迟初始化来正确构建更大的应用程序.这样做的一个示例应用程序是我书中的Flasky应用程序.
总而言之,可以将应用程序分成两部分,您只需要小心放置import语句的位置即可.在下面的示例中,我决定将db
实例和User
模型的创建移动到models.py文件中.
这是主要应用程序的模块:
from flask import Flask from flask.ext.script import Manager from flask.ext.migrate import Migrate, MigrateCommand app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db' from models import db # <-- this needs to be placed after app is created migrate = Migrate(app, db) manager = Manager(app) manager.add_command('db', MigrateCommand) if __name__ == '__main__': manager.run()
这是models.py:
from __main__ import app from flask.ext.sqlalchemy import SQLAlchemy db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(128))
这里主模块将创建app
,然后才会导入models.py.当models.py尝试app
从主模块导入时,它已经被创建.如果您from models import db
使用其他导入移动到文件的顶部,则此代码会中断.
将这么小的应用程序分区到模块中是很棘手的,因为您发现很多情况下您创建的两个模块需要相互导入,从而创建循环依赖项.
我建议你看一下如何使用app工厂函数和所有扩展的延迟初始化来正确构建更大的应用程序.这样做的一个示例应用程序是我书中的Flasky应用程序.
总而言之,可以将应用程序分成两部分,您只需要小心放置import语句的位置即可.在下面的示例中,我决定将db
实例和User
模型的创建移动到models.py文件中.
这是主要应用程序的模块:
from flask import Flask from flask.ext.script import Manager from flask.ext.migrate import Migrate, MigrateCommand app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db' from models import db # <-- this needs to be placed after app is created migrate = Migrate(app, db) manager = Manager(app) manager.add_command('db', MigrateCommand) if __name__ == '__main__': manager.run()
这是models.py:
from __main__ import app from flask.ext.sqlalchemy import SQLAlchemy db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(128))
这里主模块将创建app
,然后才会导入models.py.当models.py尝试app
从主模块导入时,它已经被创建.如果您from models import db
使用其他导入移动到文件的顶部,则此代码会中断.