Skip to main content

SQLAlchemy dialect for Excel files — use Excel as a database

Project description

sqlalchemy-excel sqlalchemy-excel

CI codecov PyPI Python 3.10+ License: MIT

SQLAlchemy dialect for Excel files — use Excel as a database.

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import DeclarativeBase, Session, Mapped, mapped_column

engine = create_engine("excel:///data.xlsx")

class Base(DeclarativeBase):
    pass

class User(Base):
    __tablename__ = "Sheet1"
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str] = mapped_column()

Base.metadata.create_all(engine)

with Session(engine) as session:
    session.add(User(id=1, name="Alice"))
    session.commit()

with Session(engine) as session:
    users = session.query(User).all()

Installation

pip install sqlalchemy-excel

excel-dbapi is automatically installed as a dependency.

URL Format

# Relative path
engine = create_engine("excel:///data.xlsx")

# Absolute path (note four slashes)
engine = create_engine("excel:////home/user/data.xlsx")

# With engine options
engine = create_engine("excel:///data.xlsx", connect_args={"engine": "openpyxl"})

Features

  • Full SQLAlchemy 2.0 dialect
  • PEP 249 DB-API 2.0 compliant driver (excel-dbapi)
  • SELECT with WHERE, ORDER BY, LIMIT
  • INSERT, UPDATE, DELETE
  • CREATE TABLE / DROP TABLE with metadata tracking
  • IN, BETWEEN, LIKE operators in WHERE clauses
  • ORM support with DeclarativeBase
  • Schema inspection (get_table_names, get_columns, has_table)
  • Type mapping: String, Integer, Float, Boolean, Date, DateTime

Type Mapping

SQLAlchemy Type Excel Storage Notes
String, Text, VARCHAR, CHAR TEXT All string types map to TEXT
Integer, SmallInteger, BigInteger INTEGER All integer types map to INTEGER
Float, Numeric, Decimal FLOAT All numeric types map to FLOAT
Boolean BOOLEAN
Date DATE
DateTime, TIMESTAMP DATETIME
Time TEXT Stored as text
Uuid TEXT Stored as text

BLOB, BINARY, JSON, and ARRAY types are not supported and will raise CompileError.

ORM Examples

Define a Model

from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, Session, Mapped, mapped_column

engine = create_engine("excel:///data.xlsx")

class Base(DeclarativeBase):
    pass

class User(Base):
    __tablename__ = "users"
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str] = mapped_column()
    age: Mapped[int] = mapped_column()

Base.metadata.create_all(engine)

Insert

with Session(engine) as session:
    session.add(User(id=1, name="Alice", age=30))
    session.add(User(id=2, name="Bob", age=25))
    session.commit()

Query with Filters

from sqlalchemy import select

with Session(engine) as session:
    # Basic query
    users = session.query(User).all()

    # WHERE clause
    user = session.query(User).filter(User.name == "Alice").first()

    # IN operator
    stmt = select(User).where(User.name.in_(["Alice", "Bob"]))
    users = session.scalars(stmt).all()

    # BETWEEN operator
    stmt = select(User).where(User.age.between(25, 35))
    users = session.scalars(stmt).all()

    # LIKE operator
    stmt = select(User).where(User.name.like("A%"))
    users = session.scalars(stmt).all()

    # ORDER BY + LIMIT
    stmt = select(User).order_by(User.age.desc()).limit(5)
    users = session.scalars(stmt).all()

Update and Delete

with Session(engine) as session:
    user = session.query(User).filter(User.id == 1).first()
    if user:
        user.name = "Ann"
        session.commit()

with Session(engine) as session:
    user = session.query(User).filter(User.id == 2).first()
    if user:
        session.delete(user)
        session.commit()

Core Usage

from sqlalchemy import create_engine, text

engine = create_engine("excel:///data.xlsx")

with engine.connect() as conn:
    result = conn.execute(text("SELECT * FROM Sheet1"))
    for row in result:
        print(row)

Schema Inspection

from sqlalchemy import create_engine, inspect

engine = create_engine("excel:///data.xlsx")
inspector = inspect(engine)

# List all sheets (tables)
print(inspector.get_table_names())

# Get column info
print(inspector.get_columns("Sheet1"))

# Check if a sheet exists
print(inspector.has_table("Sheet1"))

Limitations

  • No JOIN, GROUP BY, HAVING, DISTINCT, OFFSET
  • No subqueries, CTEs, or aggregate functions
  • No ALTER TABLE, foreign keys, or indexes
  • Single-table operations only
  • No concurrent writes — use a single-writer model
  • Session.rollback() is a no-op — Excel files do not support transactional rollback

Related Projects

  • excel-dbapi — The underlying PEP 249 DB-API 2.0 driver for Excel files.

License

MIT

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

sqlalchemy_excel-0.2.2.tar.gz (21.9 kB view details)

Uploaded Source

Built Distribution

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

sqlalchemy_excel-0.2.2-py3-none-any.whl (12.3 kB view details)

Uploaded Python 3

File details

Details for the file sqlalchemy_excel-0.2.2.tar.gz.

File metadata

  • Download URL: sqlalchemy_excel-0.2.2.tar.gz
  • Upload date:
  • Size: 21.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for sqlalchemy_excel-0.2.2.tar.gz
Algorithm Hash digest
SHA256 dc3dc213eac36dfeade7d4b51a91d9c54d70ae10277bc32edb71023bc3711868
MD5 136fc9dbf015010854a5ff27a6d54a5a
BLAKE2b-256 68abd185e2f2422991799377255be7aafa7b530598f63113e602766644ad05ce

See more details on using hashes here.

Provenance

The following attestation bundles were made for sqlalchemy_excel-0.2.2.tar.gz:

Publisher: publish-pypi.yml on yeongseon/sqlalchemy-excel

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

File details

Details for the file sqlalchemy_excel-0.2.2-py3-none-any.whl.

File metadata

File hashes

Hashes for sqlalchemy_excel-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 4d5020096784e446042d96de794e7c7e06f53ef783e7db953d3beb3841d3b10a
MD5 2af649626daece9877898da8c81c4b5d
BLAKE2b-256 e54fe83f865f91fecc094d7a45acfb45385f81e1dab12ab7543aecdd344506d3

See more details on using hashes here.

Provenance

The following attestation bundles were made for sqlalchemy_excel-0.2.2-py3-none-any.whl:

Publisher: publish-pypi.yml on yeongseon/sqlalchemy-excel

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