Flask和SqlAlchemy会话

5

我一直在构建一个Flask应用,并使用Flask-SQLAlchemy和Flask-Migrate。最近,我决定用纯SQLAlchemy和Alembic替换扩展程序,然后开始思考存储数据库会话对象(sqla)的最佳位置。

现在我的情况如下:

Base = declarative_base()


def init_db_session(app, expire_on_commit=True):
    """
    Initialize the database
    """
    engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'], convert_unicode=True)
    db_session = scoped_session(
        sessionmaker(autocommit=False, autoflush=False, expire_on_commit=expire_on_commit, bind=engine)
    )

    Base.query = db_session.query_property()

    return db_session

def init_app(app):
    """
    Flask app initialization and bootstrap
    """
    init_logging(app)
    app.celery = init_celery(app)
    app.db_session = init_db_session(app)

但是在网上看到一些文档和示例后,我在想是否使用flask全局变量g会更好。

它们都属于同一个上下文,我在文档和代码中阅读了这方面的内容,但仍然不能理解在current_app中使用它与在g中使用它的实际区别和潜在缺点。

1个回答

0

Flask文档建议在模块范围内声明会话。这也是我在自己的代码中使用的方式。

Base = declarative_base()
engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'], convert_unicode=True)
db_session = scoped_session(
    sessionmaker(
        autocommit=False,
        autoflush=False,
        expire_on_commit=expire_on_commit,
        bind=engine
    )
)

Base.query = db_session.query_property()


def init_db():
""" not much to do here if migrations are handled else where. """
    pass


def init_app(app):
    """
    Flask app initialization and bootstrap
    """
    init_logging(app)
    app.celery = init_celery(app)
    app.db_session = init_db_session(app)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接