laminlabs / lamindb

A data framework for biology.
https://docs.lamin.ai
Apache License 2.0
126 stars 10 forks source link

lndb.init with a brand new DB fails with NoReferencedTableError #465

Closed samgoodman closed 1 year ago

samgoodman commented 1 year ago

Using a fresh init of lndb with a brand-new AWS postgreSQL server passed, it seems that there's an ordering issue with table and foreign key creation, resulting in the following exception:

sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'dobject_experiment.experiment_id' could not find table 'experiment' with which to generate a foreign key to target column 'id'

Full stack trace: Traceback (most recent call last): File "/home/stgoodman123/storage/base.py", line 47, in <module> _ = BaseConnection() File "/home/stgoodman123/storage/base.py", line 22, in __init__ lndb.init(storage=blob_uri, db=sql_alchemy_uri, schema="bionty,wetlab", name="omni") File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/lndb_setup/_init_instance.py", line 112, in init setup_schema(isettings, settings.user) File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/lndb_setup/_setup_schema.py", line 73, in setup_schema msg, schema_names = load_schema(isettings) File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/lndb_setup/_setup_schema.py", line 65, in load_schema module = importlib.import_module(get_schema_module_name(schema_name)) File "/home/stgoodman123/miniconda3/lib/python3.9/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1030, in _gcd_import File "<frozen importlib._bootstrap>", line 1007, in _find_and_load File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 680, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 850, in exec_module File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/lnschema_wetlab/__init__.py", line 45, in <module> from ._core import ( # noqa File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/lnschema_wetlab/_core.py", line 87, in <module> from ._actual import Biosample, Experiment, ExperimentType, Readout, Techsample File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/lnschema_wetlab/_actual.py", line 82, in <module> add_relationship_keys(Biosample) File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/lnschema_core/dev/sqlmodel.py", line 109, in add_relationship_keys for i in getattr(table, "__mapper__").relationships: File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/sqlalchemy/util/langhelpers.py", line 1184, in __get__ obj.__dict__[self.__name__] = result = self.fget(obj) File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/sqlalchemy/orm/mapper.py", line 2621, in relationships return self._filter_properties( File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/sqlalchemy/orm/mapper.py", line 2643, in _filter_properties self._check_configure() File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/sqlalchemy/orm/mapper.py", line 1924, in _check_configure _configure_registries({self.registry}, cascade=True) File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/sqlalchemy/orm/mapper.py", line 3483, in _configure_registries _do_configure_registries(registries, cascade) File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/sqlalchemy/orm/mapper.py", line 3522, in _do_configure_registries mapper._post_configure_properties() File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/sqlalchemy/orm/mapper.py", line 1941, in _post_configure_properties prop.init() File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/sqlalchemy/orm/interfaces.py", line 231, in init self.do_init() File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/sqlalchemy/orm/relationships.py", line 2147, in do_init self._setup_join_conditions() File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/sqlalchemy/orm/relationships.py", line 2243, in _setup_join_conditions self._join_condition = jc = JoinCondition( File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/sqlalchemy/orm/relationships.py", line 2638, in __init__ self._determine_joins() File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/sqlalchemy/orm/relationships.py", line 2734, in _determine_joins self.secondaryjoin = join_condition( File "<string>", line 2, in join_condition File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/sqlalchemy/sql/selectable.py", line 1212, in _join_condition constraints = cls._joincond_scan_left_right( File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/sqlalchemy/sql/selectable.py", line 1281, in _joincond_scan_left_right col = fk.get_referent(left) File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/sqlalchemy/sql/schema.py", line 2378, in get_referent return table.corresponding_column(self.column) File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/sqlalchemy/util/langhelpers.py", line 1113, in __get__ obj.__dict__[self.__name__] = result = self.fget(obj) File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/sqlalchemy/sql/schema.py", line 2519, in column return self._resolve_column() File "/home/stgoodman123/miniconda3/lib/python3.9/site-packages/sqlalchemy/sql/schema.py", line 2530, in _resolve_column raise exc.NoReferencedTableError( sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'dobject_experiment.experiment_id' could not find table 'experiment' with which to generate a foreign key to target column 'id'

falexwolf commented 1 year ago

Hi @samgoodman! Great to meet you here and thanks for reporting!

We can't judge what's going on based on what you shared. It runs stably in several test instances across AWS & GCP and our enterprise customers but might require some configuration work.

We could investigate what is happening here given your configuration and needs within a pilot project for an enterprise plan if you're interested! Let us know! ☺️

samgoodman commented 1 year ago

Will do today, thanks Alex.

falexwolf commented 1 year ago

Awesome! Let me know when you'd like to have a first meeting - probably better to schedule via email!