excel-dbapi 0.2.1__tar.gz → 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- excel_dbapi-0.3.0/CHANGELOG.md +66 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/PKG-INFO +46 -34
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/README.md +45 -33
- excel_dbapi-0.3.0/docs/SQL_SPEC.md +398 -0
- excel_dbapi-0.3.0/logo.svg +21 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/pyproject.toml +1 -1
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/__init__.py +1 -1
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/parser.py +81 -7
- excel_dbapi-0.3.0/tests/test_golden_ddl.py +56 -0
- excel_dbapi-0.3.0/tests/test_golden_delete.py +81 -0
- excel_dbapi-0.3.0/tests/test_golden_insert.py +103 -0
- excel_dbapi-0.3.0/tests/test_golden_select.py +146 -0
- excel_dbapi-0.3.0/tests/test_golden_update.py +92 -0
- excel_dbapi-0.3.0/tests/test_low_coverage_modules.py +408 -0
- excel_dbapi-0.3.0/tests/test_reflection.py +204 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_sql_extensions.py +12 -4
- excel_dbapi-0.2.1/CHANGELOG.md +0 -18
- excel_dbapi-0.2.1/logo.svg +0 -24
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.editorconfig +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/ISSUE_TEMPLATE/task.yml +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/RELEASE_CHECKLIST.md +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/RELEASE_NOTES_TEMPLATE.md +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/dependabot.yml +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/labels.yml +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/release.yml +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/workflows/ci.yml +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/workflows/publish-pypi.yml +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.gitignore +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.pre-commit-config.yaml +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/CODE_OF_CONDUCT.md +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/CONTRIBUTING.md +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/LICENSE +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/Makefile +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/SECURITY.md +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/SUPPORT.md +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/cliff.toml +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/codecov.yml +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/docs/DEVELOPMENT.md +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/docs/OPERATIONS.md +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/docs/PUBLIC_ROADMAP.md +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/docs/QUICKSTART_10_MIN.md +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/docs/ROADMAP.md +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/docs/USAGE.md +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/examples/advanced_query.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/examples/basic_usage.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/examples/education/lesson_01_first_query.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/examples/education/lesson_02_parameter_binding.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/examples/pandas_engine.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/examples/transactions.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/examples/write_operations.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/connection.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/cursor.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/__init__.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/base.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/graph/__init__.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/graph/auth.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/graph/backend.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/graph/client.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/graph/locator.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/graph/session.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/openpyxl/__init__.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/openpyxl/backend.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/pandas/__init__.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/pandas/backend.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/registry.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/result.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/exceptions.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/executor.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/openpyxl/__init__.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/py.typed +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/reflection.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/sanitize.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/__init__.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/data/sample.xlsx +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/graph/__init__.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/graph/test_auth.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/graph/test_backend.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/graph/test_client.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/graph/test_locator.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_additional_coverage.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_api_extensions.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_atomic_rollback_integration.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_base_engine.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_connection.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_connection_graph.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_cursor.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_engine.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_engine_state.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_error_paths.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_exceptions.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_executor.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_formula_injection.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_integration.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_openpyxl_edge_cases.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_openpyxl_facade.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_parser.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_parser_errors.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_pep249_compliance.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_sql_boundaries.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_sql_features.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_stage1_fixes.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_where_operators.py +0 -0
- {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_write_operations.py +0 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## [0.3.0] - 2026-04-12
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- Formal SQL subset specification (`docs/SQL_SPEC.md`) with EBNF grammar
|
|
9
|
+
- Parser golden tests for all statement families (SELECT, INSERT, UPDATE, DELETE, DDL)
|
|
10
|
+
- Reflection helpers unit tests
|
|
11
|
+
- Comprehensive low-coverage module tests (executor, backends, graph engine)
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
- README restructured: limitations-first layout, Graph API moved to experimental section
|
|
15
|
+
- Test coverage: 84% → 98% (397 tests)
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
- Parser tokenizer: quoted strings with embedded spaces now handled correctly
|
|
19
|
+
- Parser: escaped quotes (`''`, `""`) parsed correctly in all contexts
|
|
20
|
+
|
|
21
|
+
## [0.2.1] - 2026-04-12
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
- Project logo (modern minimalist SVG)
|
|
25
|
+
- Comprehensive README documentation (WHERE operators section, Related Projects)
|
|
26
|
+
- Contributing guide, Code of Conduct, Security and Support policies
|
|
27
|
+
- Development tooling: Makefile, .editorconfig, pre-commit-config, codecov.yml, git-cliff config
|
|
28
|
+
- GitHub issue/PR templates and project management files
|
|
29
|
+
- py.typed marker for PEP 561 compliance
|
|
30
|
+
- twine check step in publish workflow
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
- Classifier updated from Alpha to Beta
|
|
34
|
+
- Homepage metadata updated
|
|
35
|
+
- Version bumped to 0.2.1
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
- Oracle review findings: rollback docs, absolute logo URLs, metadata alignment
|
|
39
|
+
|
|
40
|
+
## [0.2.0] - 2026-04-12
|
|
41
|
+
|
|
42
|
+
### Added
|
|
43
|
+
- IN, BETWEEN, LIKE operators for SQL parser and executor
|
|
44
|
+
- Test coverage reporting with Codecov CI integration
|
|
45
|
+
|
|
46
|
+
### Changed
|
|
47
|
+
- Version bumped from 0.1.x to 0.2.0 (skipping reserved PyPI versions)
|
|
48
|
+
|
|
49
|
+
### Fixed
|
|
50
|
+
- All mypy strict errors resolved; strict mode enabled in CI
|
|
51
|
+
- CI: install pandas extra for test suite
|
|
52
|
+
|
|
53
|
+
## [0.1.0] - 2026-04-12
|
|
54
|
+
|
|
55
|
+
### Added
|
|
56
|
+
- PEP 249 (DB-API 2.0) compliant driver for Excel files
|
|
57
|
+
- SQL support: SELECT, INSERT, UPDATE, DELETE, CREATE TABLE, DROP TABLE
|
|
58
|
+
- WHERE clauses with AND/OR, comparison operators, LIKE, IN, IS NULL/IS NOT NULL
|
|
59
|
+
- ORDER BY and LIMIT for SELECT queries
|
|
60
|
+
- Openpyxl engine (default) for local .xlsx files
|
|
61
|
+
- Pandas engine (optional) for DataFrame-based operations
|
|
62
|
+
- Microsoft Graph API engine (optional) for remote Excel files
|
|
63
|
+
- Formula injection defense (enabled by default)
|
|
64
|
+
- Transaction simulation (commit/rollback)
|
|
65
|
+
- Reflection helpers for dialect integration
|
|
66
|
+
- Metadata sheet support for schema persistence
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: excel-dbapi
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: PEP 249 compliant DB-API driver for Excel files
|
|
5
5
|
Project-URL: Homepage, https://github.com/yeongseon/excel-dbapi
|
|
6
6
|
Project-URL: Repository, https://github.com/yeongseon/excel-dbapi
|
|
@@ -45,40 +45,36 @@ Description-Content-Type: text/markdown
|
|
|
45
45
|
|
|
46
46
|

|
|
47
47
|
[](https://codecov.io/gh/yeongseon/excel-dbapi)
|
|
48
|
+
[](https://pypi.org/project/excel-dbapi/)
|
|
48
49
|
[](https://www.python.org/downloads/)
|
|
49
50
|
[](https://opensource.org/licenses/MIT)
|
|
51
|
+
[](https://github.com/yeongseon/excel-dbapi/tree/main/docs)
|
|
50
52
|
|
|
51
|
-
A
|
|
53
|
+
A **local-first** Python DB-API 2.0 connector for Excel files.
|
|
52
54
|
Use SQL to query, insert, update, and delete rows in `.xlsx` workbooks — no database server required.
|
|
53
55
|
|
|
54
|
-
##
|
|
56
|
+
## Limitations
|
|
55
57
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
- **
|
|
59
|
-
- **
|
|
58
|
+
Before you begin, understand what excel-dbapi is **not**:
|
|
59
|
+
|
|
60
|
+
- **No JOIN, GROUP BY, HAVING, DISTINCT, or subqueries** — single-table operations only
|
|
61
|
+
- **No concurrent writes** — use a single-writer model
|
|
62
|
+
- **Not for large datasets** — if your Excel file has 100k+ rows, use pandas directly or a database
|
|
63
|
+
- **No transactional rollback guarantees** — rollback restores an in-memory snapshot, not a WAL
|
|
64
|
+
- **PandasEngine rewrites workbooks** — formatting, charts, images, and formulas are dropped
|
|
60
65
|
|
|
61
|
-
|
|
66
|
+
If you need relational features, use SQLite or PostgreSQL.
|
|
62
67
|
|
|
63
|
-
|
|
64
|
-
- If you need concurrent writes from multiple processes → use a real database
|
|
65
|
-
- If your Excel file has 100k+ rows → use pandas directly or a database
|
|
68
|
+
See the full [SQL Specification](docs/SQL_SPEC.md) for the exact SQL subset supported.
|
|
66
69
|
|
|
67
70
|
---
|
|
68
71
|
|
|
69
|
-
##
|
|
72
|
+
## Who is this for?
|
|
70
73
|
|
|
71
|
-
-
|
|
72
|
-
-
|
|
73
|
-
-
|
|
74
|
-
-
|
|
75
|
-
- WHERE conditions with AND/OR and comparison operators
|
|
76
|
-
- IN, BETWEEN, LIKE operators in WHERE clauses
|
|
77
|
-
- ORDER BY and LIMIT for SELECT
|
|
78
|
-
- Sheet-to-Table mapping
|
|
79
|
-
- Pandas & Openpyxl engine selector
|
|
80
|
-
- Formula injection defense (enabled by default)
|
|
81
|
-
- Transaction simulation (commit/rollback)
|
|
74
|
+
- **Data analysts** who want to query Excel files with SQL instead of manual filtering
|
|
75
|
+
- **Citizen developers** automating small workflows with familiar SQL syntax
|
|
76
|
+
- **Educators** teaching SQL concepts without setting up a database
|
|
77
|
+
- **Prototypers** building quick data pipelines before moving to a real database
|
|
82
78
|
|
|
83
79
|
---
|
|
84
80
|
|
|
@@ -264,36 +260,52 @@ The Pandas engine preserves Python types. If a column contains integers,
|
|
|
264
260
|
|
|
265
261
|
---
|
|
266
262
|
|
|
267
|
-
##
|
|
263
|
+
## Experimental: Remote Excel via Microsoft Graph API
|
|
268
264
|
|
|
269
|
-
|
|
270
|
-
- `OpenpyxlEngine` loads with `data_only=True`, so formulas are evaluated to values when reading.
|
|
271
|
-
- Use a **single-writer model** for writes. Avoid writing to the same file from multiple processes.
|
|
272
|
-
- Save is implemented with a temporary file + atomic replace (`os.replace`) for safer persistence.
|
|
273
|
-
- No support for JOIN, GROUP BY, HAVING, or subqueries.
|
|
265
|
+
> **Status**: Experimental — API may change in future releases.
|
|
274
266
|
|
|
275
|
-
|
|
267
|
+
excel-dbapi can access remote Excel files on OneDrive/SharePoint via the Microsoft Graph API.
|
|
276
268
|
|
|
277
|
-
|
|
269
|
+
```bash
|
|
270
|
+
pip install excel-dbapi[graph]
|
|
271
|
+
```
|
|
278
272
|
|
|
279
|
-
|
|
273
|
+
```python
|
|
274
|
+
from excel_dbapi.connection import ExcelConnection
|
|
280
275
|
|
|
281
|
-
|
|
276
|
+
conn = ExcelConnection(
|
|
277
|
+
"msgraph://drives/{drive_id}/items/{item_id}",
|
|
278
|
+
engine="graph",
|
|
279
|
+
credential=your_credential,
|
|
280
|
+
autocommit=True,
|
|
281
|
+
)
|
|
282
|
+
cursor = conn.cursor()
|
|
283
|
+
cursor.execute("SELECT * FROM Sheet1")
|
|
284
|
+
print(cursor.fetchall())
|
|
285
|
+
conn.close()
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
The Graph backend is **read-only by default**. Write operations require explicit opt-in
|
|
289
|
+
and a valid Azure credential with appropriate Graph API permissions.
|
|
282
290
|
|
|
291
|
+
For details, see the [Usage Guide](docs/USAGE.md).
|
|
292
|
+
|
|
293
|
+
---
|
|
283
294
|
|
|
284
295
|
## Related Projects
|
|
285
296
|
|
|
286
297
|
- [sqlalchemy-excel](https://github.com/yeongseon/sqlalchemy-excel) — SQLAlchemy dialect that uses excel-dbapi as its DB-API 2.0 driver. Use `create_engine("excel:///file.xlsx")` for full ORM support.
|
|
298
|
+
|
|
287
299
|
---
|
|
288
300
|
|
|
289
301
|
## Documentation
|
|
290
302
|
|
|
303
|
+
- [SQL Specification](docs/SQL_SPEC.md)
|
|
291
304
|
- [Usage Guide](docs/USAGE.md)
|
|
292
305
|
- [Development Guide](docs/DEVELOPMENT.md)
|
|
293
306
|
- [Project Roadmap](docs/ROADMAP.md)
|
|
294
307
|
- [10-Minute Quickstart](docs/QUICKSTART_10_MIN.md)
|
|
295
308
|
- [Operations Notes](docs/OPERATIONS.md)
|
|
296
|
-
- [Public Roadmap](docs/PUBLIC_ROADMAP.md)
|
|
297
309
|
|
|
298
310
|
## Examples
|
|
299
311
|
|
|
@@ -5,40 +5,36 @@
|
|
|
5
5
|
|
|
6
6
|

|
|
7
7
|
[](https://codecov.io/gh/yeongseon/excel-dbapi)
|
|
8
|
+
[](https://pypi.org/project/excel-dbapi/)
|
|
8
9
|
[](https://www.python.org/downloads/)
|
|
9
10
|
[](https://opensource.org/licenses/MIT)
|
|
11
|
+
[](https://github.com/yeongseon/excel-dbapi/tree/main/docs)
|
|
10
12
|
|
|
11
|
-
A
|
|
13
|
+
A **local-first** Python DB-API 2.0 connector for Excel files.
|
|
12
14
|
Use SQL to query, insert, update, and delete rows in `.xlsx` workbooks — no database server required.
|
|
13
15
|
|
|
14
|
-
##
|
|
16
|
+
## Limitations
|
|
15
17
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
- **
|
|
19
|
-
- **
|
|
18
|
+
Before you begin, understand what excel-dbapi is **not**:
|
|
19
|
+
|
|
20
|
+
- **No JOIN, GROUP BY, HAVING, DISTINCT, or subqueries** — single-table operations only
|
|
21
|
+
- **No concurrent writes** — use a single-writer model
|
|
22
|
+
- **Not for large datasets** — if your Excel file has 100k+ rows, use pandas directly or a database
|
|
23
|
+
- **No transactional rollback guarantees** — rollback restores an in-memory snapshot, not a WAL
|
|
24
|
+
- **PandasEngine rewrites workbooks** — formatting, charts, images, and formulas are dropped
|
|
20
25
|
|
|
21
|
-
|
|
26
|
+
If you need relational features, use SQLite or PostgreSQL.
|
|
22
27
|
|
|
23
|
-
|
|
24
|
-
- If you need concurrent writes from multiple processes → use a real database
|
|
25
|
-
- If your Excel file has 100k+ rows → use pandas directly or a database
|
|
28
|
+
See the full [SQL Specification](docs/SQL_SPEC.md) for the exact SQL subset supported.
|
|
26
29
|
|
|
27
30
|
---
|
|
28
31
|
|
|
29
|
-
##
|
|
32
|
+
## Who is this for?
|
|
30
33
|
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
- WHERE conditions with AND/OR and comparison operators
|
|
36
|
-
- IN, BETWEEN, LIKE operators in WHERE clauses
|
|
37
|
-
- ORDER BY and LIMIT for SELECT
|
|
38
|
-
- Sheet-to-Table mapping
|
|
39
|
-
- Pandas & Openpyxl engine selector
|
|
40
|
-
- Formula injection defense (enabled by default)
|
|
41
|
-
- Transaction simulation (commit/rollback)
|
|
34
|
+
- **Data analysts** who want to query Excel files with SQL instead of manual filtering
|
|
35
|
+
- **Citizen developers** automating small workflows with familiar SQL syntax
|
|
36
|
+
- **Educators** teaching SQL concepts without setting up a database
|
|
37
|
+
- **Prototypers** building quick data pipelines before moving to a real database
|
|
42
38
|
|
|
43
39
|
---
|
|
44
40
|
|
|
@@ -224,36 +220,52 @@ The Pandas engine preserves Python types. If a column contains integers,
|
|
|
224
220
|
|
|
225
221
|
---
|
|
226
222
|
|
|
227
|
-
##
|
|
223
|
+
## Experimental: Remote Excel via Microsoft Graph API
|
|
228
224
|
|
|
229
|
-
|
|
230
|
-
- `OpenpyxlEngine` loads with `data_only=True`, so formulas are evaluated to values when reading.
|
|
231
|
-
- Use a **single-writer model** for writes. Avoid writing to the same file from multiple processes.
|
|
232
|
-
- Save is implemented with a temporary file + atomic replace (`os.replace`) for safer persistence.
|
|
233
|
-
- No support for JOIN, GROUP BY, HAVING, or subqueries.
|
|
225
|
+
> **Status**: Experimental — API may change in future releases.
|
|
234
226
|
|
|
235
|
-
|
|
227
|
+
excel-dbapi can access remote Excel files on OneDrive/SharePoint via the Microsoft Graph API.
|
|
236
228
|
|
|
237
|
-
|
|
229
|
+
```bash
|
|
230
|
+
pip install excel-dbapi[graph]
|
|
231
|
+
```
|
|
238
232
|
|
|
239
|
-
|
|
233
|
+
```python
|
|
234
|
+
from excel_dbapi.connection import ExcelConnection
|
|
240
235
|
|
|
241
|
-
|
|
236
|
+
conn = ExcelConnection(
|
|
237
|
+
"msgraph://drives/{drive_id}/items/{item_id}",
|
|
238
|
+
engine="graph",
|
|
239
|
+
credential=your_credential,
|
|
240
|
+
autocommit=True,
|
|
241
|
+
)
|
|
242
|
+
cursor = conn.cursor()
|
|
243
|
+
cursor.execute("SELECT * FROM Sheet1")
|
|
244
|
+
print(cursor.fetchall())
|
|
245
|
+
conn.close()
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
The Graph backend is **read-only by default**. Write operations require explicit opt-in
|
|
249
|
+
and a valid Azure credential with appropriate Graph API permissions.
|
|
242
250
|
|
|
251
|
+
For details, see the [Usage Guide](docs/USAGE.md).
|
|
252
|
+
|
|
253
|
+
---
|
|
243
254
|
|
|
244
255
|
## Related Projects
|
|
245
256
|
|
|
246
257
|
- [sqlalchemy-excel](https://github.com/yeongseon/sqlalchemy-excel) — SQLAlchemy dialect that uses excel-dbapi as its DB-API 2.0 driver. Use `create_engine("excel:///file.xlsx")` for full ORM support.
|
|
258
|
+
|
|
247
259
|
---
|
|
248
260
|
|
|
249
261
|
## Documentation
|
|
250
262
|
|
|
263
|
+
- [SQL Specification](docs/SQL_SPEC.md)
|
|
251
264
|
- [Usage Guide](docs/USAGE.md)
|
|
252
265
|
- [Development Guide](docs/DEVELOPMENT.md)
|
|
253
266
|
- [Project Roadmap](docs/ROADMAP.md)
|
|
254
267
|
- [10-Minute Quickstart](docs/QUICKSTART_10_MIN.md)
|
|
255
268
|
- [Operations Notes](docs/OPERATIONS.md)
|
|
256
|
-
- [Public Roadmap](docs/PUBLIC_ROADMAP.md)
|
|
257
269
|
|
|
258
270
|
## Examples
|
|
259
271
|
|