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.
Files changed (107) hide show
  1. excel_dbapi-0.3.0/CHANGELOG.md +66 -0
  2. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/PKG-INFO +46 -34
  3. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/README.md +45 -33
  4. excel_dbapi-0.3.0/docs/SQL_SPEC.md +398 -0
  5. excel_dbapi-0.3.0/logo.svg +21 -0
  6. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/pyproject.toml +1 -1
  7. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/__init__.py +1 -1
  8. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/parser.py +81 -7
  9. excel_dbapi-0.3.0/tests/test_golden_ddl.py +56 -0
  10. excel_dbapi-0.3.0/tests/test_golden_delete.py +81 -0
  11. excel_dbapi-0.3.0/tests/test_golden_insert.py +103 -0
  12. excel_dbapi-0.3.0/tests/test_golden_select.py +146 -0
  13. excel_dbapi-0.3.0/tests/test_golden_update.py +92 -0
  14. excel_dbapi-0.3.0/tests/test_low_coverage_modules.py +408 -0
  15. excel_dbapi-0.3.0/tests/test_reflection.py +204 -0
  16. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_sql_extensions.py +12 -4
  17. excel_dbapi-0.2.1/CHANGELOG.md +0 -18
  18. excel_dbapi-0.2.1/logo.svg +0 -24
  19. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.editorconfig +0 -0
  20. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  21. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  22. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  23. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/ISSUE_TEMPLATE/task.yml +0 -0
  24. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  25. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/RELEASE_CHECKLIST.md +0 -0
  26. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/RELEASE_NOTES_TEMPLATE.md +0 -0
  27. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/dependabot.yml +0 -0
  28. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/labels.yml +0 -0
  29. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/release.yml +0 -0
  30. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/workflows/ci.yml +0 -0
  31. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.github/workflows/publish-pypi.yml +0 -0
  32. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.gitignore +0 -0
  33. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/.pre-commit-config.yaml +0 -0
  34. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/CODE_OF_CONDUCT.md +0 -0
  35. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/CONTRIBUTING.md +0 -0
  36. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/LICENSE +0 -0
  37. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/Makefile +0 -0
  38. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/SECURITY.md +0 -0
  39. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/SUPPORT.md +0 -0
  40. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/cliff.toml +0 -0
  41. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/codecov.yml +0 -0
  42. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/docs/DEVELOPMENT.md +0 -0
  43. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/docs/OPERATIONS.md +0 -0
  44. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/docs/PUBLIC_ROADMAP.md +0 -0
  45. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/docs/QUICKSTART_10_MIN.md +0 -0
  46. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/docs/ROADMAP.md +0 -0
  47. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/docs/USAGE.md +0 -0
  48. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/examples/advanced_query.py +0 -0
  49. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/examples/basic_usage.py +0 -0
  50. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/examples/education/lesson_01_first_query.py +0 -0
  51. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/examples/education/lesson_02_parameter_binding.py +0 -0
  52. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/examples/pandas_engine.py +0 -0
  53. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/examples/transactions.py +0 -0
  54. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/examples/write_operations.py +0 -0
  55. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/connection.py +0 -0
  56. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/cursor.py +0 -0
  57. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/__init__.py +0 -0
  58. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/base.py +0 -0
  59. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/graph/__init__.py +0 -0
  60. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/graph/auth.py +0 -0
  61. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/graph/backend.py +0 -0
  62. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/graph/client.py +0 -0
  63. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/graph/locator.py +0 -0
  64. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/graph/session.py +0 -0
  65. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/openpyxl/__init__.py +0 -0
  66. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/openpyxl/backend.py +0 -0
  67. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/pandas/__init__.py +0 -0
  68. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/pandas/backend.py +0 -0
  69. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/registry.py +0 -0
  70. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/result.py +0 -0
  71. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/exceptions.py +0 -0
  72. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/executor.py +0 -0
  73. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/openpyxl/__init__.py +0 -0
  74. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/py.typed +0 -0
  75. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/reflection.py +0 -0
  76. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/src/excel_dbapi/sanitize.py +0 -0
  77. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/__init__.py +0 -0
  78. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/data/sample.xlsx +0 -0
  79. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/graph/__init__.py +0 -0
  80. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/graph/test_auth.py +0 -0
  81. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/graph/test_backend.py +0 -0
  82. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/graph/test_client.py +0 -0
  83. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/graph/test_locator.py +0 -0
  84. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_additional_coverage.py +0 -0
  85. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_api_extensions.py +0 -0
  86. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_atomic_rollback_integration.py +0 -0
  87. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_base_engine.py +0 -0
  88. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_connection.py +0 -0
  89. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_connection_graph.py +0 -0
  90. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_cursor.py +0 -0
  91. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_engine.py +0 -0
  92. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_engine_state.py +0 -0
  93. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_error_paths.py +0 -0
  94. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_exceptions.py +0 -0
  95. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_executor.py +0 -0
  96. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_formula_injection.py +0 -0
  97. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_integration.py +0 -0
  98. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_openpyxl_edge_cases.py +0 -0
  99. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_openpyxl_facade.py +0 -0
  100. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_parser.py +0 -0
  101. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_parser_errors.py +0 -0
  102. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_pep249_compliance.py +0 -0
  103. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_sql_boundaries.py +0 -0
  104. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_sql_features.py +0 -0
  105. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_stage1_fixes.py +0 -0
  106. {excel_dbapi-0.2.1 → excel_dbapi-0.3.0}/tests/test_where_operators.py +0 -0
  107. {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.2.1
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
  ![CI](https://github.com/yeongseon/excel-dbapi/actions/workflows/ci.yml/badge.svg)
47
47
  [![codecov](https://codecov.io/gh/yeongseon/excel-dbapi/branch/main/graph/badge.svg)](https://codecov.io/gh/yeongseon/excel-dbapi)
48
+ [![PyPI](https://img.shields.io/pypi/v/excel-dbapi.svg)](https://pypi.org/project/excel-dbapi/)
48
49
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/)
49
50
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)
51
+ [![Docs](https://img.shields.io/badge/docs-GitHub-blue.svg)](https://github.com/yeongseon/excel-dbapi/tree/main/docs)
50
52
 
51
- A lightweight, Python DB-API 2.0 compliant connector for Excel files.
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
- ## Who is this for?
56
+ ## Limitations
55
57
 
56
- - **Data analysts** who want to query Excel files with SQL instead of manual filtering
57
- - **Citizen developers** automating small workflows with familiar SQL syntax
58
- - **Educators** teaching SQL concepts without setting up a database
59
- - **Prototypers** building quick data pipelines before moving to a real database
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
- ### Who is this NOT for?
66
+ If you need relational features, use SQLite or PostgreSQL.
62
67
 
63
- - If you need JOINs, GROUP BY, subqueries, or advanced SQL use SQLite or PostgreSQL
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
- ## Features
72
+ ## Who is this for?
70
73
 
71
- - Python DB-API 2.0 compliant interface (PEP 249)
72
- - Query Excel files using SQL syntax
73
- - Supports SELECT, INSERT, UPDATE, DELETE
74
- - Basic DDL support (CREATE TABLE, DROP TABLE)
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
- ## Limitations and Operational Guidance
263
+ ## Experimental: Remote Excel via Microsoft Graph API
268
264
 
269
- - `PandasEngine` rewrites workbooks and may drop formatting, charts, and formulas.
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
- ## Roadmap
267
+ excel-dbapi can access remote Excel files on OneDrive/SharePoint via the Microsoft Graph API.
276
268
 
277
- - Remote file connection improvements
269
+ ```bash
270
+ pip install excel-dbapi[graph]
271
+ ```
278
272
 
279
- See [Project Roadmap](docs/ROADMAP.md) for details.
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
  ![CI](https://github.com/yeongseon/excel-dbapi/actions/workflows/ci.yml/badge.svg)
7
7
  [![codecov](https://codecov.io/gh/yeongseon/excel-dbapi/branch/main/graph/badge.svg)](https://codecov.io/gh/yeongseon/excel-dbapi)
8
+ [![PyPI](https://img.shields.io/pypi/v/excel-dbapi.svg)](https://pypi.org/project/excel-dbapi/)
8
9
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/)
9
10
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)
11
+ [![Docs](https://img.shields.io/badge/docs-GitHub-blue.svg)](https://github.com/yeongseon/excel-dbapi/tree/main/docs)
10
12
 
11
- A lightweight, Python DB-API 2.0 compliant connector for Excel files.
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
- ## Who is this for?
16
+ ## Limitations
15
17
 
16
- - **Data analysts** who want to query Excel files with SQL instead of manual filtering
17
- - **Citizen developers** automating small workflows with familiar SQL syntax
18
- - **Educators** teaching SQL concepts without setting up a database
19
- - **Prototypers** building quick data pipelines before moving to a real database
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
- ### Who is this NOT for?
26
+ If you need relational features, use SQLite or PostgreSQL.
22
27
 
23
- - If you need JOINs, GROUP BY, subqueries, or advanced SQL use SQLite or PostgreSQL
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
- ## Features
32
+ ## Who is this for?
30
33
 
31
- - Python DB-API 2.0 compliant interface (PEP 249)
32
- - Query Excel files using SQL syntax
33
- - Supports SELECT, INSERT, UPDATE, DELETE
34
- - Basic DDL support (CREATE TABLE, DROP TABLE)
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
- ## Limitations and Operational Guidance
223
+ ## Experimental: Remote Excel via Microsoft Graph API
228
224
 
229
- - `PandasEngine` rewrites workbooks and may drop formatting, charts, and formulas.
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
- ## Roadmap
227
+ excel-dbapi can access remote Excel files on OneDrive/SharePoint via the Microsoft Graph API.
236
228
 
237
- - Remote file connection improvements
229
+ ```bash
230
+ pip install excel-dbapi[graph]
231
+ ```
238
232
 
239
- See [Project Roadmap](docs/ROADMAP.md) for details.
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