Skip to main content

Support the compatibility between `flask_sqlalchemy` and `flask_sqlalchemy_lite`.

Project description

Flask SQLAlchemy Compat

Banner

GitHub release (latest SemVer) GitHub all releases GitHub PyPI - Downloads

GitHub Actions (Build) GitHub Actions (Release)

Support the compatibility between flask_sqlalchemy and flask_sqlalchemy_lite. It allows users to make minimal changes when they need to migrate from either one of these two packages to each other.

The main motivation of this package is because flask_sqlalchemy_lite does not support python<=3.8. This package is designed for providing the similar usages when users have to make the flask_sqlalchemy_lite working with python<=3.8 by using flask_sqlalchemy. In this case, users can get rid of the difficulty of maintaining two sets of codes.

[!WARNING] This package is designed for sqlalchemy>=2.0.0 only. If you are using an older version. You cannot use this package.

[!WARNING] To make this package work with python=3.7, users should install an unofficial flask-sqlalchemy version.

1. Install

Intall the latest released version of this package by using the PyPI source:

python -m pip install flask-sqlalchemy-compat

or use the following commands to install the developing version from the GitHub Source when you have already installed Git :hammer::

python -m pip install "flask-sqlalchemy-compat[dev] @ git+https://github.com/cainmagi/flask-sqlalchemy-compat.git"

[!WARNING] To make this package work with python=3.7, users should install an unofficial flask-sqlalchemy version. See

https://github.com/pallets-eco/flask-sqlalchemy/issues/1140#issuecomment-1577921154

This unofficial version can be installed by:

python -m pip install flask-sqlalchemy-compat[backends]

2. Usage

When you are using flask-sqlalchemy-lite, using the following codes will let your codes fall back to the compatible mode if flask-sqlalchemy-lite is not installed but flask-sqlalchemy is installed.

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"))

    with app.app_context():
        app.config.update({"SQLALCHEMY_ENGINES": {"default": "sqlite:///main.db"}})
        db.init_app(app)

        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.")

The above codes will works no matter flask_sqlalchemy_lite or flask_sqlalchemy is installed.

Similarly, the following example is designed for the codes written with flask_sqlalchemy. The codes fall back to the compatible mode if flask-sqlalchemy is not installed but flask-sqlalchemy-lite is installed.

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"))

    with app.app_context():
        app.config.update({"SQLALCHEMY_DATABASE_URI": "sqlite:///main.db"})
        db.init_app(app)
        db.create_all()

        # Indeed, flask_sqlalchemy has a type hint issue until `3.1.x`.
        # But it does not cause issues in run time. See
        # 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.")

The magic happens if you run the first example with only flask-sqlalchemy installed and the second example with only flask-sqlalchemy-lite installed.

3. Documentation

[!CAUTION] The documentation is not accessible now because it is still to be done.

Check the documentation to find more details about the examples and APIs.

https://cainmagi.github.io/flask-sqlalchemy-compat/

4. Contributing

See CONTRIBUTING.md :book:

5. Changelog

See Changelog.md :book:

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

flask_sqlalchemy_compat-0.1.2.tar.gz (92.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

Flask_SQLAlchemy_compat-0.1.2-py3-none-any.whl (27.2 kB view details)

Uploaded Python 3

File details

Details for the file flask_sqlalchemy_compat-0.1.2.tar.gz.

File metadata

  • Download URL: flask_sqlalchemy_compat-0.1.2.tar.gz
  • Upload date:
  • Size: 92.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.0.1 CPython/3.12.8

File hashes

Hashes for flask_sqlalchemy_compat-0.1.2.tar.gz
Algorithm Hash digest
SHA256 88c97310bcbc9cbb7e04963dffe5f0d088e3a96b0b535d5b52ff36a3b7f0e9bc
MD5 d4dd3c6209322c5d87277408566e6155
BLAKE2b-256 faafdb16c9220e050f6db078ed498ed29cee57e5c05dca6b752454d0fa78283c

See more details on using hashes here.

Provenance

The following attestation bundles were made for flask_sqlalchemy_compat-0.1.2.tar.gz:

Publisher: python-publish.yml on cainmagi/flask-sqlalchemy-compat

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file Flask_SQLAlchemy_compat-0.1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for Flask_SQLAlchemy_compat-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 e37f0626ff7122c9254bc831a557d9d8a430944866cbd999f4c8371e333f2755
MD5 9c550aa728bdaa53781cd1b670f33ebe
BLAKE2b-256 cc4dd43da90988fa9ae5585cdc6403373f54b5f9d610fbfa7c6f026dc49e5bc5

See more details on using hashes here.

Provenance

The following attestation bundles were made for Flask_SQLAlchemy_compat-0.1.2-py3-none-any.whl:

Publisher: python-publish.yml on cainmagi/flask-sqlalchemy-compat

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page