After digging through docs and some more code, here’s what seems to work.

The single, shared package should not generate that *Base* class which is 
then used by other packages. Instead, it now provides a function that 
generates and returns a *Base* class; better yet, that function takes a *schema 
<https://docs.sqlalchemy.org/en/14/core/metadata.html#sqlalchemy.schema.MetaData.params.schema>*
 
parameter and passes that on to the MetaData initializer.

With that function available, all other packages can create their own *Base* 
class and use that for their respective table mappings. Passing the schema 
parameter also allows a small step towards customizing that generated Base, 
e.g. with a schema name for PostgreSQL 
<https://www.postgresql.org/docs/current/ddl-schemas.html> dbs.

I think I can now create an Engine and Connection 
<https://docs.sqlalchemy.org/en/14/core/connections.html>, and use the 
different *Base* classes and their mappings in isolation…

One interesting detail: SQLA defines the type returned by *declarative_base() 
<https://docs.sqlalchemy.org/en/14/orm/mapping_api.html#sqlalchemy.orm.declarative_base>*
 
as Any (code 
<https://github.com/sqlalchemy/sqlalchemy/blob/9a8d039716068ded890e726ba344620907d86170/lib/sqlalchemy/orm/decl_api.py#L762-L772>,
 see 
also this SO conversation 
<https://stackoverflow.com/questions/58325495/what-type-do-i-use-for-sqlalchemy-declarative-base>)
 
such that I have to use:

*    CustomBase: typing.Any = create_base(schema="foo")*

Is there a better way to type-hint *CustomBase* here?

On Thursday, July 28, 2022 at 10:09:26 PM UTC+10 [email protected] wrote:

> Hello,
>
> I’m using a *Base = declarative_base() 
> <https://docs.sqlalchemy.org/en/14/orm/mapping_api.html#sqlalchemy.orm.declarative_base>*
>  
> in a single, shared package that other packages can import and use. Now 
> suppose I have two more packages, each of which declares a bunch of 
> mappings using that one common *Base*.
>
> Is it possible to separate the mappings? I noticed that after importing 
> both packages, *Base.metadata.tables.keys()* lists all table mappings 
> from both packages.
>
> However, I’d like to treat the tables from these two packages separately 
> and bind them to different engines (and databases).
>
> Is that possible?
>
> Much thanks!
> Jens
>

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/6a2ce911-f5ec-46f9-bb75-62a36005d2ban%40googlegroups.com.

Reply via email to