Python 我如何使用惰性初始化SQLAlchemy
我正在使用Flask和SQL Alchemy创建一个Web应用程序。 包结构如下所示:Python 我如何使用惰性初始化SQLAlchemy,python,scope,sqlalchemy,flask,Python,Scope,Sqlalchemy,Flask,我正在使用Flask和SQL Alchemy创建一个Web应用程序。 包结构如下所示: from sqlalchemy.engine import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import create_session, scoped_session #some stuff def create_app(name=__name__, confi
from sqlalchemy.engine import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import create_session, scoped_session
#some stuff
def create_app(name=__name__, configuration=None):
from .modules import admin
from .modules.admin.models import User
app = Flask(name, static_path='/static', template_folder=template_dir)
load_config(app, configuration)
init_engine(app.config['SQLALCHEMY_DATABASE_URI'])
return app
def init_engine(uri, **kwargs):
global engine
engine = create_engine(uri, **kwargs)
Base.metadata.create_all(engine)
db.begin()
return engine
def load_config(app, config=None):
app.config.from_object(__name__)
app.config.from_object('default_settings')
app.config.from_envvar('SKELETON_SETTINGS', silent=True)
if config:
app.config.from_object(config)
#some other stuff
engine = None
db = scoped_session(lambda: create_session(bind=engine))
runserver.py
runserver.py
--- skeleton
--- filters
--- helpers
--- models
--- modules
--- admin
--- api
--- debug
--- frontend
--- static
--- templates
--- tests
我知道如何延迟加载作用域会话。但是我如何在正常的会话中做到这一点呢
我在我的应用程序的基本包中的uuu init_uuu文件中有一个create_app函数
我的初始化文件如下所示:
from sqlalchemy.engine import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import create_session, scoped_session
#some stuff
def create_app(name=__name__, configuration=None):
from .modules import admin
from .modules.admin.models import User
app = Flask(name, static_path='/static', template_folder=template_dir)
load_config(app, configuration)
init_engine(app.config['SQLALCHEMY_DATABASE_URI'])
return app
def init_engine(uri, **kwargs):
global engine
engine = create_engine(uri, **kwargs)
Base.metadata.create_all(engine)
db.begin()
return engine
def load_config(app, config=None):
app.config.from_object(__name__)
app.config.from_object('default_settings')
app.config.from_envvar('SKELETON_SETTINGS', silent=True)
if config:
app.config.from_object(config)
#some other stuff
engine = None
db = scoped_session(lambda: create_session(bind=engine))
我不能使用烧瓶炼金术,因为其他模块不支持它,模型会变得混乱很多
初始化数据库并在需要时执行如下导入的最佳实践是什么:
从骨架导入数据库
谢谢分享您的想法好的。我想这也是我自己想出来的。 我现在正在使用这个片段。如果你有更好的想法,请告诉我
Base = declarative_base()
engine = None
sessionmaker = sessionmaker()
db = scoped_session(sessionmaker)
def configure_engine(url):
global sessionmaker, engine, db
engine = create_engine(url)
db.remove()
sessionmaker.configure(bind=engine)
def create_app(name=__name__, configuration=None):
from .modules import admin
from .modules.admin.models import User
app = Flask(name, static_path='/static', template_folder=template_dir)
load_config(app, configuration)
celery.config_from_object(app.config)
configure_engine(app.config['SQLALCHEMY_DATABASE_URI'])
filters.init_app(app)
register_local_modules(app)
admin.init_app(app)
login_manager.init_app(app)
@login_manager.user_loader
def load_user(id):
return db.query(User).get(id)
# Enable the DebugToolbar
if app.config['DEBUG_TOOLBAR']:
toolbar = DebugToolbarExtension(app)
return app