Changelog 2025¶
2025-01-20 db 1.0.2¶
🚚 Improvments for lamindb v1 migrations. PR @falexwolf
add a
.description
field toSchema
enable labeling
Run
withULabel
add a
.predecessors
and.successors
field toProject
akin to what’s present onTransform
make
.uid
fields not editable
2025-01-18 db 1.0.1¶
🐛 Block non-admin users from confirming the dialogue for integrating lnschema-core
. PR @falexwolf
2025-01-17 db 1.0.0¶
This release makes the API consistent, integrates lnschema_core
& ourprojects
into the lamindb
package, and introduces a breadth of database migrations to enable future features without disruption. You’ll now need at least Python 3.10.
Your code will continue to run as is, but you will receive warnings about a few renamed API components.
What |
Before |
After |
---|---|---|
Dataset vs. model |
|
|
Python object for |
|
|
Number of files |
|
|
|
|
|
|
|
|
Consecutiveness field |
|
|
Run initiator |
|
|
|
|
|
Migration guide:
Upon
lamin connect account/instance
you will be prompted to confirm migrating away fromlnschema_core
After that, you will be prompted to call
lamin migrate deploy
to apply database migrations
New features:
✨ Allow filtering by multiple
obs
columns inMappedCollection
PR @Koncopd✨ In git sync, also search git blob hash in non-default branches PR @Zethson
✨ Add relationship with
Project
to everything exceptRun
,Storage
&User
so that you can easily filter for the entities relevant to your project PR @falexwolf✨ Capture logs of scripts during
ln.track()
PR1 PR2 @falexwolf @Koncopd✨ Support
"|"
-seperated multi-values inCurator
PR @sunnyosun🚸 Accept
None
inconnect()
and improve migration dialogue PR @falexwolf
UX improvements:
🚸 Simplify the
ln.track()
experience PR @falexwolfyou can omit the
uid
argumentyou can organize transforms in folders
versioning is fully automated (requirement for 1.)
you can save scripts and notebooks without running them (corollary of 1.)
you avoid the interactive prompt in a notebook and the throwing of an error in a script (corollary of 1.)
you are no longer required to add a title in a notebook
🚸 Raise error when modifying
Artifact.key
in problematic ways PR1 PR2 @sunnyosun @Koncopd🚸 Better error message on running
ln.track()
within Python terminal PR @Koncopd🚸 Hide traceback for
InstanceNotEmpty
using Click Exception PR @Zethson🚸 Only auto-search
._name_field
in sub-classes ofCanCurate
PR @falexwolf🚸 Simplify installation & API overview PR @falexwolf
🚸 Make
lamin_run_uid
categorical in tiledbsoma stores PR @Koncopd🚸 Raise
ValueError
when trying to search aNone
value PR @Zethson
Bug fixes:
🐛 Skip deleting storage when deleting outdated versions of folder-like artifacts PR @Koncopd
🐛 Let
SOMACurator()
validate and annotate all.obs
columns PR @falexwolf🐛 Fix renaming of feature sets PR @sunnyosun
🐛 Do not raise an exception when default AWS credentials fail PR @Koncopd
🐛 Only map synonyms when field is name PR @sunnyosun
🐛 Fix
source
in.from_values
PR @sunnyosun🐛 Fix creating instances with storage in the current local working directory PR @Koncopd
🐛 Fix NA values in
Curator.add_new_from()
PR @sunnyosun
Refactors, renames & maintenance:
🏗️ Integrate
lnschema-core
intolamindb
PR1 PR2 @falexwolf @Koncopd🏗️ Integrate
ourprojects
into lamindb PR @falexwolf♻️ Manage
created_at
,updated_at
on the database-level, makecreated_by
not editable PR @falexwolf🚚 Rename transform type “glue” to “linker” PR @falexwolf
🚚 Deprecate the
--schema
argument oflamin init
in favor of--modules
PR @falexwolf
DevOps:
Detailed list of database migrations
Those not yet announced above will be announced with the functionality they enable.
♻️ Add
contenttypes
Django plugin PR @falexwolf🚚 Prepare introduction of persistable
Curator
objects by renamingFeatureSet
toSchema
on the database-level PR @falexwolf🚚 Add a
.type
foreign key toULabel
,Feature
,FeatureSet
,Reference
,Param
PR @falexwolf🚚 Introduce
RunData
,TidyTable
, andTidyTableData
in the database PR @falexwolf
All remaining database schema changes were made in this PR @falexwolf. Data migrations happen automatically.
remove
_source_code_artifact
from Transform, it’s been deprecated since 0.75data migration: for all transforms that have
_source_code_artifact
populated, populatesource_code
rename
Transform.name
toTransform.description
because it’s analogous toArtifact.description
backward compat:
in the
Transform
constructor usename
to populatekey
in all cases in which onlyname
is passedreturn the same transform based on
key
in casesource_code is None
via._name_field = "key"
data migrations:
there already was a legacy
description
field that was never exposed on the constructor; to be safe, we concatenated potential data in it on the new description field Claude chatfor all transforms that have
key=None
andname!=None
, usename
to pre-populatekey
rename
Collection.name
toCollection.key
for consistency withArtifact
&Transform
and the high likelihood of you wanting to organize them hierarchicallya
_branch_code
integer on every record to model pull requestsinclude
visibility
within that coderepurpose
visibility=0
as_branch_code=0
as “archive”put an index on it
code a “draft” as _branch_code = 2, and “draft prs” as negative branch codes
rename values
"number"
to"num"
in dtypean
._aux
json field onRecord
a SmallInteger
run._status_code
that allows to writefinished_at
in clean up operations so that there is a run time also for aborted runsrename
Run.is_consecutive
toRun._is_consecutive
a
_template_id
FK to store the information of the generating template (whether a record is a template is coded via _branch_code)rename
_accessor
tootype
to publicly declare the data format assuffix, accessor
rename
Artifact.type
toArtifact.kind
a FK to artifact
run._logfile
which holds logsa
hash
field onParamValue
andFeatureValue
to enforce uniqueness without running the danger of failure for large dictionariesadd a boolean field
._expect_many
toFeature
/Param
that defaults toTrue
/False
and indicates whether values for this feature/param are expected to occur a single or multiple times for every single artifact/runfor feature
if it’s
True
(default), the values come from an observation-level aggregation and a dtype ofdatetime
on the observation-level meanset[datetime]
on the artifact-levelif it’s
False
it’s an artifact-level value anddatetime
meansdatetime
; this is an edge case because an arbitrary artifact would always be a set of arbitrary measurements that would need to be aggregated (“one just happens to measure a single cell line in that artifact”)
for param
if it’s
False
(default), the values mean artifact/run-level values anddatetime
meansdatetime
if it’s
True
, the values would be from an aggregation, this seems like an edge case but say when characterizing a model ensemble trained with different parameters it could be relevant
remove the
.transform
foreign key from artifact and collection for consistency with all other records; introduce a property and a simple filter statement instead that maintains the same UXstore provenance metadata for
TransformULabel
,RunParamValue
,ArtifactParamValue
enable linking projects & references to transforms & collections
rename
Run.parent
toRun.initiated_by_run
introduce a boolean flag on artifact that’s called
_overwrite_versions
, which indicates whether versions are overwritten or stored separately; it defaults toFalse
for file-like artifacts and toTrue
for folder-like artifactsRename
n_objects
ton_files
for more clarityAdd a
Space
registry to lamindb with an FK on everyBasicRecord
add a name column to
Run
so that a specific run can be used as a named specific analysisremove
_previous_runs
field on everything exceptArtifact
&Collection