SQLAlchemy dialect for Excel files — use Excel as a database
Project description
sqlalchemy-excel
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc3dc213eac36dfeade7d4b51a91d9c54d70ae10277bc32edb71023bc3711868
|
|
| MD5 |
136fc9dbf015010854a5ff27a6d54a5a
|
|
| BLAKE2b-256 |
68abd185e2f2422991799377255be7aafa7b530598f63113e602766644ad05ce
|
Provenance
The following attestation bundles were made for sqlalchemy_excel-0.2.2.tar.gz:
Publisher:
publish-pypi.yml on yeongseon/sqlalchemy-excel
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sqlalchemy_excel-0.2.2.tar.gz -
Subject digest:
dc3dc213eac36dfeade7d4b51a91d9c54d70ae10277bc32edb71023bc3711868 - Sigstore transparency entry: 1280570240
- Sigstore integration time:
-
Permalink:
yeongseon/sqlalchemy-excel@c3527e7b91b0cd5fee27c85ac77fe9e97d7216a4 -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/yeongseon
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@c3527e7b91b0cd5fee27c85ac77fe9e97d7216a4 -
Trigger Event:
release
-
Statement type:
File details
Details for the file sqlalchemy_excel-0.2.2-py3-none-any.whl.
File metadata
- Download URL: sqlalchemy_excel-0.2.2-py3-none-any.whl
- Upload date:
- Size: 12.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d5020096784e446042d96de794e7c7e06f53ef783e7db953d3beb3841d3b10a
|
|
| MD5 |
2af649626daece9877898da8c81c4b5d
|
|
| BLAKE2b-256 |
e54fe83f865f91fecc094d7a45acfb45385f81e1dab12ab7543aecdd344506d3
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sqlalchemy_excel-0.2.2-py3-none-any.whl -
Subject digest:
4d5020096784e446042d96de794e7c7e06f53ef783e7db953d3beb3841d3b10a - Sigstore transparency entry: 1280570241
- Sigstore integration time:
-
Permalink:
yeongseon/sqlalchemy-excel@c3527e7b91b0cd5fee27c85ac77fe9e97d7216a4 -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/yeongseon
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@c3527e7b91b0cd5fee27c85ac77fe9e97d7216a4 -
Trigger Event:
release
-
Statement type: