简介
本项目提供了针对flask_sqlalchemy
和flask_sqlalchemy_lite
的兼容性支持。藉此以最小的修改,实现从其中之一向另一包的相互迁移。
适用场景如下:
-
令使用
flask_sqlitealchemy_lite
的代码支持到Python 3.7~3.8
:设计此包的主要目的,是因为
flask_sqlalchemy_lite
不支持python<=3.8
。此包在python<=3.8
时,透过flask_sqlalchemy
实现了类似flask_sqlalchemy_lite
的接口、并提供了相似的用法。因此,当用户需要兼容到低版本时,此包免去了维护两套代码的麻烦。 -
在使用
flask_sqlalchemy_lite
时,仍需使用flask_sqlalchemy
的API:相比
flask_sqlalchemy_lite
,历史更久的flask_sqlalchemy
支持更多的功能。由于这些功能大多用来撰写老旧风格的代码,在flask_sqlalchemy_lite
就不再得到支持。然而,若用户想要从flask_sqlalchemy
迁移到flask_sqlalchemy_lite
,又不愿修改过多的代码,此包就可以作为一个可用方案。 -
在
Python 3.7
的环境下,仍需使用sqlalchemy>=2.0.0
提供的sa.orm.DeclarativeBase
功能:SQLAlchemy 2代码风格提供了
sa.orm.DeclarativeBase
和sa.orm.Mapped
。这些用法本身是支持Python 3.7
的。然而,flask_sqlalchemy
对Python 3.7
支持的最高版本仅到3.0.5
,并且不支持DeclarativeBase
的功能。此项目提供了一个flask_sqlalchemy
的兼容版本,允许用户在Python 3.7
的前提下,使用DeclarativeBase
。
用法
- Flask SQLAlchemy Lite
- Flask SQLAlchemy
当你主要使用flask_sqlalchemy_lite
时,以下代码可以帮助你的代码,在flask_sqlalchemy_lite
未安装、而flask_sqlalchemy
又安装了的情况下,退到兼容模式。
import sqlalchemy as sa
import sqlalchemy.orm as sa_orm
import flask_sqlalchemy_compat as fsc
class _Base(sa_orm.DeclarativeBase): ...
db, Base = fsc.get_flask_sqlalchemy_lite(_Base)
class NewModel(Base):
__tablename__ = "new_model"
id: sa_orm.Mapped[int] = sa_orm.mapped_column(primary_key=True)
name: sa_orm.Mapped[str] = sa_orm.mapped_column()
if __name__ == "__main__":
import os
import flask
app = flask.Flask(__name__, instance_path=os.path.abspath("./instance"))
app.config.update({"SQLALCHEMY_ENGINES": {"default": "sqlite:///main.db"}})
db.init_app(app)
with app.app_context():
Base.metadata.create_all(db.engine)
db.session.add(NewModel(name="new"))
db.session.commit()
model = db.session.scalar(sa.select(NewModel))
print(model.id, model.name) if model is not None else print("NOT FOUND.")
这意味着,只要你安装了flask_sqlalchemy
,即使你没有安装flask_sqlalchemy_lite
,以上代码仍然能正常工作。
类似地,下例则是为flask_sqlalchemy
所写。其会在flask-sqlalchemy
未安装、但flask-sqlalchemy_lite
已安装时,退到兼容模式。
import sqlalchemy as sa
import sqlalchemy.orm as sa_orm
import flask_sqlalchemy_compat as fsc
class _Base(sa_orm.DeclarativeBase): ...
db = fsc.get_flask_sqlalchemy(_Base)
class NewModel(db.Model):
id: sa_orm.Mapped[int] = sa_orm.mapped_column(primary_key=True)
name: sa_orm.Mapped[str] = sa_orm.mapped_column()
if __name__ == "__main__":
import os
import flask
app = flask.Flask(__name__, instance_path=os.path.abspath("./instance"))
app.config.update({"SQLALCHEMY_DATABASE_URI": "sqlite:///main.db"})
db.init_app(app)
with app.app_context():
db.create_all()
# 诚然,flask-sqlalchemy直到`3.1.x`、还存在类型标记错误。
# 但这并不妨碍运行时的表现。参见
# https://github.com/pallets-eco/flask-sqlalchemy/issues/1312
db.session.add(NewModel(name="new"))
db.session.commit()
model = db.session.scalar(sa.select(NewModel))
print(model.id, model.name) if model is not None else print("NOT FOUND.")
若你并未安装flask_sqlalchemy
、却安装了flask_sqlalchemy_lite
,以上范例代码仍然能正常工作。
鸣谢
- Pallets-Eco/Flask-SQLAlchemy-Lite:新的、Flask的SQLAlchemy扩展。仅支持
Python>=3.9
。 - Pallets-Eco/Flask-SQLAlchemy:旧的、Flask的SQLAlchemy扩展。
- SQLAlchemy/SQLAlchemy:SQL工具箱、以及对象关系映射引擎。
相关材料
更新手记:
本项目的许可证:
合作与贡献指南:
贡献者利用规约:
漏洞防治与安全策略: