我想构建我的Flask应用程序,例如:
./site.py
./apps/members/__init__.py
./apps/members/models.py
Run Code Online (Sandbox Code Playgroud)
apps.members 是一个Flask蓝图.
现在,为了创建模型类,我需要掌握应用程序,例如:
# apps.members.models
from flask import current_app
from flaskext.sqlalchemy import SQLAlchemy
db = SQLAlchemy(current_app)
class Member(db.Model):
# fields here
pass
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试将该模型导入我的Blueprint应用程序,我会感到害怕RuntimeError: working outside of request context.我怎样才能正确掌握我的应用程序?相对导入可能有效,但它们非常丑陋且有自己的上下文问题,例如:
from ...site import app
# ValueError: Attempted relative import beyond toplevel package
Run Code Online (Sandbox Code Playgroud) 我无法让Alembic使用db.Model(Flask-SQLAlchemy)而不是使用(Flask-SQLAlchemy)自动生成从更改到类的候选迁移Base.
我已修改env.py为创建我的Flask应用程序,导入所有相关模型,初始化数据库,然后运行迁移:
...
uri = 'mysql://user:password@host/dbname?charset=utf8'
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = uri
app.config['SQLALCHEMY_ECHO'] = True
db.init_app(app)
with app.test_request_context():
target_metadata = db.Model.metadata
config.set_main_option('sqlalchemy.url', uri)
if context.is_offline_mode():
run_migrations_offline()
else:
run_migrations_online()
...
Run Code Online (Sandbox Code Playgroud)
这种方法工作正常drop_all(),create_all()(例如,重新创建单元测试的测试分贝时),但似乎在这种情况下落空.自动生成的版本脚本始终具有空的升级和降级方法,例如,
def upgrade():
### commands auto generated by Alembic - please adjust! ###
pass
### end Alembic commands ###
def downgrade():
### commands auto generated by Alembic - please adjust! ###
pass
### end Alembic commands ###
Run Code Online (Sandbox Code Playgroud)
我的更改包括重命名列,更改列定义等 …
sqlalchemy database-migration flask flask-sqlalchemy alembic
我试图Alembic第一次使用,并希望使用此处--autogenerate描述的功能
我的项目结构看起来像
project/
configuration/
__init__.py
dev.py
test.py
core/
app/
models/
__init__.py
user.py
db/
alembic/
versions/
env.py
alembic.ini
Run Code Online (Sandbox Code Playgroud)
我使用Flask,并SQLAlchemy和他们的Flask-SQLAlchemy扩展.我的模特User看起来像
class User(UserMixin, db.Model):
__tablename__ = 'users'
# noinspection PyShadowingBuiltins
uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True,
unique=True)
email = Column('email', String, nullable=False, unique=True)
_password = Column('password', String, nullable=False)
created_on = Column('created_on', sa.types.DateTime(timezone=True),
default=datetime.utcnow())
last_login = Column('last_login', sa.types.DateTime(timezone=True),
onupdate=datetime.utcnow())
Run Code Online (Sandbox Code Playgroud)
如上所述这里,我修改env.py的样子
from configuration import app
alembic_config = config.get_section(config.config_ini_section) …Run Code Online (Sandbox Code Playgroud)