Skip to main content

sqlalchemy-file

SQLAlchemy-file is a SQLAlchemy extension for attaching files to SQLAlchemy model and uploading them to various storage such as Local Storage, Amazon S3, Rackspace CloudFiles, Google Storage and others using Apache Libcloud.

Test suite Publish Codecov Package version Supported Python versions

The key features are:

  • Multiple Storage : Use Object Storage API provided by Apache Libcloud to store files. Therefore, you can store your files on Local Storage, Amazon S3, Google Cloud Storage, MinIO etc, and easily switch between them. For a full list of supported providers visit supported providers page from Apache Libcloud documentation.
  • Validator : Provide an interface for validating each files before saving them.
  • Size Validator : Built-in validator for file maximum size validation.
  • Content-Type Validator : Built-in validator for file mimetype restrictions.
  • Image Validator : Built-in validator for image mimetype, width, height and ratio validation.
  • Processor : Provide an interface to easily save multiple transformation of the original files.
  • ThumbnailGenerator : Built-in processor to auto generate thumbnail
  • Multiple Files : You can attach multiple files directly to a Model.
  • Session awareness : Whenever an object is deleted or a rollback is performed the files uploaded during the unit of work or attached to the deleted objects are automatically deleted.
  • Meant for Evolution : Change the storage provider anytime you want, old data will continue to work
  • SQLModel Support: Tested with SQLModel

Documentation: https://jowilf.github.io/sqlalchemy-file

Source Code: https://github.com/jowilf/sqlalchemy-file


Requirements

Python 3.11 or above.

As SQLAlchemy-file is based on Apache Libcloud and SQLAlchemy, it requires them. They will be automatically installed when you install SQLAlchemy-file.

Installation

PIP

$ pip install sqlalchemy-file

uv

$ uv add sqlalchemy-file

Optional dependencies (extras)

Some features need third-party packages that are not installed by default:

Extra Installs Required for
sqlalchemy-file[pillow] Pillow ImageField, ImageValidator, ThumbnailGenerator
sqlalchemy-file[local] fasteners LocalStorageDriver backend (required by libcloud's local storage)
sqlalchemy-file[all] Pillow + fasteners Everything above
$ pip install "sqlalchemy-file[local,pillow]"
$ uv add "sqlalchemy-file[all]"

Without the matching extra you get an explicit ImportError telling you which extra to install (e.g. use ImageField without Pillow, or the local storage driver without fasteners).

Example

Attaching files to models is as simple as declaring a field on the model itself

import os

from libcloud.storage.drivers.local import LocalStorageDriver
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Session
from sqlalchemy_file import File, FileField
from sqlalchemy_file.storage import StorageManager

Base = declarative_base()


# Define your model
class Attachment(Base):
    __tablename__ = "attachment"

    id = Column(Integer, autoincrement=True, primary_key=True)
    name = Column(String(50), unique=True)
    content = Column(FileField)


# Configure Storage
os.makedirs("./upload_dir/attachment", 0o777, exist_ok=True)
container = LocalStorageDriver("./upload_dir").get_container("attachment")
StorageManager.add_storage("default", container)

# Save your model
engine = create_engine(
    "sqlite:///example.db", connect_args={"check_same_thread": False}
)
Base.metadata.create_all(engine)

with Session(engine) as session, open("./example.txt", "rb") as local_file:
    # from an opened local file
    session.add(Attachment(name="attachment1", content=local_file))

    # from bytes
    session.add(Attachment(name="attachment2", content=b"Hello world"))

    # from string
    session.add(Attachment(name="attachment3", content="Hello world"))

    # from a File object with custom filename and content_type
    file = File(content="Hello World", filename="hello.txt", content_type="text/plain")
    session.add(Attachment(name="attachment4", content=file))

    # from a File object specifying a content path
    session.add(
        Attachment(name="attachment5", content=File(content_path="./example.txt"))
    )

    session.commit()
  • filedepot: When I was looking for a library like this, depot was the best I saw. This project inspired SQLAlchemy-file extensively and some features are implemented the same.
  • sqlalchemy-media: Another attachment extension for SqlAlchemy to manage assets which are associated with database models

Metadata

Release files for sqlalchemy-file 0.7.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sqlalchemy-file 0.7.0
File Size Uploaded Provenance
sqlalchemy_file-0.7.0.tar.gz 18.5 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for sqlalchemy-file 0.7.0
File Interpreter ABI Platform
sqlalchemy_file-0.7.0-py3-none-any.whl Python 3 none any Details

Total release size: 40.8 kB

Release files / sqlalchemy_file-0.7.0.tar.gz

Download URL sqlalchemy_file-0.7.0.tar.gz
Size 18.5 kB
Tags Source
SHA-256 checksum
How to use checksums
231af3800797cbfeff66d233c4b75b46d6e3da7b8a41962505f4dc0882dcee13
BLAKE2b-256 checksum
How to use checksums
35589a990cd2d8a758c6a33dc13c1bb0554dd54444a1063843caa107b183a4a7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / sqlalchemy_file-0.7.0-py3-none-any.whl

Download URL sqlalchemy_file-0.7.0-py3-none-any.whl
Size 22.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d297a28ee158c3a08edff1dae58dc240b81133449a2f3c345f39451ea4020426
BLAKE2b-256 checksum
How to use checksums
c06115e23ddcdb105aebe6ea56dc9ea405616665cbf6092c04c78c63e3f4baf6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for sqlalchemy-file 0.7.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page