Releases: datajoint/datajoint-python
Release 2.2.4
Highlights
A small follow-up patch on 2.2.3 cleaning up rough edges discovered during the docs review:
dj.StorageAdapteranddj.get_storage_adapter()exposed at top level. The Storage Adapter plugin contract documented in the spec used these names as if they were re-exported from the top-leveldatajointnamespace, but they were not. Plugin authors following the spec literally hitAttributeError. Both symbols are now indatajoint.__all__and importable asdj.StorageAdapter/dj.get_storage_adapter.packagingdeclared as an explicit dependency.src/datajoint/migrate.pyimportspackaging.version.Version, but the package was never declared inpyproject.toml. With Python 3.12 venvs no longer shippingsetuptools(which used to pullpackagingtransitively),pip install datajoint==2.2.3into a clean Py3.12 venv hitModuleNotFoundError: No module named 'packaging'onimport datajoint. Fixed.- Source-side version markers refreshed in
settings.pydocstrings and comments to match the public docs.
⚡️ Enhancements
- feat: export StorageAdapter and get_storage_adapter at top level (#1463)@dimitri-yatsenko
🐛 Bug Fixes
- fix: declare packaging as an explicit dependency (#1462)@dimitri-yatsenko
📝 Documentation
- docs: refresh settings.py version markers (#1461)@dimitri-yatsenko
Companion docs: datajoint/datajoint-docs#172 — env-var configuration of stores + Storage Adapter API spec.
Full Changelog: v2.2.3...v2.2.4
Release 2.2.3
Highlights
This patch release adds env-var configuration for object stores (closes the gap for env-var-only deployments such as the DataJoint platform, Kubernetes, and Lambda) and ships several minor fixes and documentation improvements.
DJ_STORES— JSON-encoded copy of thestoresdict, same shape as indatajoint.json. Replaces the file'sstoresblock when set, with arbitrary adapter-defined attribute names (token, api_key, workspace_url…).DJ_IGNORE_CONFIG_FILE(defaultfalse) — whentrue, skipsdatajoint.json, the project.secrets/, and/run/secrets/datajoint/entirely. Hard guarantee that no file on disk leaks into config..secrets/stores.<name>.<attr>now accepts any attribute, not onlyaccess_key/secret_key— supports plugin-registered adapters (e.g. Databricks Unity Catalog Volumes) with non-S3-style credential fields.
Precedence (high → low): programmatic dj.config["stores"] > DJ_STORES > datajoint.json > .secrets/stores.<name>.<attr> (fills missing attrs only).
⚡️ Enhancements
- feat(config): DJ_STORES env var + DJ_IGNORE_CONFIG_FILE flag + arbitrary
.secrets/attrs (#1452)@dimitri-yatsenko - chore: remove .vscode and .devcontainer (#1459)@dimitri-yatsenko
📝 Documentation
- docs: extend datajoint.migrate timeline to 2.4 or 2.5 (#1456)@dimitri-yatsenko
- docs: fix code formatting on rendered codecs API page (#1455)@dimitri-yatsenko
- docs: use relative path for README pipeline image (#1450)@MilagrosMarin
- docs: refresh README pipeline illustration (#1448)@dimitri-yatsenko
- docs: cite DataJoint 2.0 manuscript and add RRID (#1449)@dimitri-yatsenko
Companion docs: datajoint/datajoint-docs#172
Full Changelog: v2.2.2...v2.2.3
Release 2.2.2
⚡️ Enhancements
- feat: add StorageAdapter plugin system for third-party storage protocols (#1432) @kushalbakshi
- refactor: simplify index query, warn on MariaDB connections (#1439) @dimitri-yatsenko
- feat: export AutoPopulate and Job in public API (#1431) @dimitri-yatsenko
🐛 Bug Fixes
- fix(#1442): scan_*_references reads raw JSON metadata instead of decoded codec output (#1444) @kushalbakshi
- fix(#1438): preserve json flag for MariaDB longtext-aliased columns (#1443) @dimitri-yatsenko
- fix(#1433): clear error for leading-underscore attribute names (#1441) @dimitri-yatsenko
- fix: remove EXPRESSION column dependency in get_indexes_sql() (#1437) @dimitri-yatsenko
- fix: preserve NOT NULL constraint in migrate_columns() (#1435) @dimitri-yatsenko
Full Changelog: v2.2.1...v2.2.2
Release 2.2.1
Released: 2026-04-09
⚡️ Enhancements
- feat: add
database.namesetting for PostgreSQL connections (#1426) @kushalbakshi- Configurable database name via
dj.config["database.name"],DJ_DATABASE_NAMEenv var, ordatabase_namekwarg onConnection - Extracts
_build_connect_kwargs()helper to eliminate duplicated connection parameter construction __repr__and logger show database name when set (e.g.,user@host:5432/my_db)- Warns when
database.nameis set with MySQL backend - Deprecates
database_prefix(warning emitted atSchema.activate())
- Configurable database name via
📝 Documentation
- Fix CONTRIBUTING.md link for PyPI (#1422) @dimitri-yatsenko
- Add PostgreSQL configuration to CONTRIBUTING.md
- Document
database.namesetting anddatabase_prefixdeprecation (datajoint-docs#159) - Fix dead links in llms.txt — now auto-generated from mkdocs nav (datajoint-docs#160)
Full Changelog: v2.2.0...v2.2.1
v2.2.0
What's Changed
For a comprehensive overview of all new features, see What's New in DataJoint 2.2.
Added
- Graph-driven cascade delete and restrict on Diagram (#1407, fixes #865, #1110): New
Diagram.cascade(),Diagram.restrict(),Diagram.prune(), andDiagram.counts()methods replace the error-driven cascade approach. Delete and drop operations now use the pipeline DAG to determine affected tables before executing, with full dry-run support viasafemode=True. - Thread-safe mode with
dj.Instance(#1404): Newdj.Instance()class provides independent database connections with connection-scoped configuration. Enables safe concurrent access from multiple threads (e.g., web servers, parallel workers). - Directory references in
<filepath@store>(#1415, fixes #1410): Filepath storage now supports directory references.is_diris detected dynamically; existence checks and storage operations handle directories correctly.
Fixed
populate()withreserve_jobs=Trueignores restrictions (#1414, fixes #1413): Restrictions are now correctly applied when fetching pending keys in distributed mode, matching the behavior of direct (non-distributed) populate.- Populate antijoin uses
.proj()for correct pending key computation (#1405): Fixes cases where overlapping secondary attributes caused incorrect pending key calculations. - Allow attribute names starting with 'index' in declarations (#1412, fixes #1411): Table definitions with attribute names like
index_valueno longer raise parse errors. - Cascade delete failures on MySQL 8 (fixes #1110): The graph-driven cascade in #1407 eliminates the error code mismatch (1217 vs 1451) that caused cascade delete failures on MySQL 8.
Changed
- Backend-agnostic quoting and adapter abstractions (#1419): Refactored identifier quoting, table name construction, and schema queries into adapter methods for cleaner multi-backend (MySQL + PostgreSQL) support.
skip_duplicates=Truebehavior documented for PostgreSQL (#1417, fixes #1049): PostgreSQL already enforces secondary unique constraints whenskip_duplicates=True(raisesDuplicateErroron secondary unique conflicts, unlike MySQL which skips silently). This asymmetry is now documented and tested.
Full Changelog: v2.1.1...v2.2.0
v2.1.1
What's Changed
Bug Fixes
- Atomic job reservation to prevent race condition (#1399, fixes #1398):
Job.reserve()now uses a single atomicUPDATE ... WHERE status='pending'instead of a non-atomic SELECT→UPDATE pattern, preventing multiple workers from reserving the same key. - Hide comments from table preview display (#1393): SQL comments in table definitions are no longer shown in
.preview()output. - Correct Part table names in diagrams (#1392): Part tables now display correctly in diagrams by properly stripping the module prefix.
Removals
- Remove
size_on_disk(#1395): Removedsize_on_diskproperty fromTableandSchemaclasses. Use database-native tools for storage metrics.
Full Changelog: v2.1.0...v2.1.1
v0.14.9
What's Changed
Bug Fix
- Skip redundant S3 upload when file already exists (#1400, fixes #1397): After a transaction rollback,
upload_filepathno longer re-uploads files that already exist in S3 with matching size and contents hash. This avoids unnecessary network transfers and potential timeouts on large files.
Maintenance
Full Changelog: v0.14.8...v0.14.9
Release 2.1.0
What's Changed
Added
-
PostgreSQL backend support — DataJoint now supports PostgreSQL as an alternative to MySQL. Use
dj.config['database.backend'] = 'postgresql'to connect to PostgreSQL databases. (#1338, #1339, #1340) -
Diagram improvements (#1345)
- New
collapse()method for high-level pipeline views - Mermaid output format support via
output='mermaid' - Schema grouping with module labels
- Direction control (
direction='LR'ordirection='TB') - Default diagram direction changed from TB to LR
- New
-
Singleton tables — Support for tables with empty primary keys (#1341)
Changed
- Performance: Lazy-load
deepdiffandtqdmin autopopulate for faster imports (#1349) - Packaging: Switched from setuptools to hatchling for build system (#1358)
Deprecated
- The
migratemodule shows deprecation warning (#1373)
Fixed
- Allow table class names with underscores (with warning) (#1375)
Documentation
- Converted all docstrings to NumPy style (#1378)
Full Changelog: v2.0.2...v2.1.0
DataJoint 2.0.2
Bug Fixes
-
fix: Support 'KEY' in fetch() for backward compatibility (#1384)
- Restores
fetch('KEY')syntax from DataJoint 0.14 - Fixes #1381
- Restores
-
fix: Handle inhomogeneous array shapes in to_arrays() (#1382)
- Correctly handles blob arrays with different shapes
- Fixes #1380
-
fix: Handle semantic_check for job table operations (#1383)
- Fixes
populate(reserve_jobs=True)whenkeep_completed=True - Fixes #1379
- Fixes
-
fix: Handle missing SSL context in multiprocess populate (#1377)
- Prevents errors when SSL context is not available in child processes
Installation
pip install datajoint==2.0.2DataJoint 0.14.8
Bug Fixes
- fix: Add config option to skip filepath checksum on insert (#1387)
- New
filepath_checksum_size_limit_insertconfig option - Prevents transaction timeouts when inserting large files with filepath attributes in three-part
make()methods - Fixes #1386
- New
Usage
import datajoint as dj
# Skip checksum on insert for files > 1GB
dj.config['filepath_checksum_size_limit_insert'] = 1024 * 1024 * 1024Installation
pip install datajoint==0.14.8