@@ -140,3 +140,68 @@ class Admin(User): # type: ignore[no-redef]
140140 admin = db .session .execute (db .select (Admin )).scalar_one ()
141141 db .session .expire (admin )
142142 assert admin .org == "pallets"
143+
144+
145+ @pytest .mark .usefixtures ("app_ctx" )
146+ def test_session_multiple_dbs (app : Flask , model_class : t .Any ) -> None :
147+ app .config ["SQLALCHEMY_BINDS" ] = {"db1" : "sqlite:///" }
148+ db = SQLAlchemy (app , model_class = model_class )
149+
150+ if issubclass (db .Model , (sa_orm .MappedAsDataclass )):
151+
152+ class User (db .Model ):
153+ id : sa_orm .Mapped [int ] = sa_orm .mapped_column (
154+ sa .Integer , primary_key = True , init = False
155+ )
156+ name : sa_orm .Mapped [str ] = sa_orm .mapped_column (
157+ sa .String (50 ), nullable = False , init = False
158+ )
159+
160+ class Product (db .Model ):
161+ __bind_key__ = "db1"
162+ id : sa_orm .Mapped [int ] = sa_orm .mapped_column (
163+ sa .Integer , primary_key = True , init = False
164+ )
165+ name : sa_orm .Mapped [str ] = sa_orm .mapped_column (
166+ sa .String (50 ), nullable = False , init = False
167+ )
168+
169+ elif issubclass (db .Model , (sa_orm .DeclarativeBase , sa_orm .DeclarativeBaseNoMeta )):
170+
171+ class User (db .Model ): # type: ignore[no-redef]
172+ id : sa_orm .Mapped [int ] = sa_orm .mapped_column (sa .Integer , primary_key = True )
173+ name : sa_orm .Mapped [str ] = sa_orm .mapped_column (
174+ sa .String (50 ), nullable = False
175+ )
176+
177+ class Product (db .Model ): # type: ignore[no-redef]
178+ __bind_key__ = "db1"
179+ id : sa_orm .Mapped [int ] = sa_orm .mapped_column (sa .Integer , primary_key = True )
180+ name : sa_orm .Mapped [str ] = sa_orm .mapped_column (
181+ sa .String (50 ), nullable = False
182+ )
183+
184+ else :
185+
186+ class User (db .Model ): # type: ignore[no-redef]
187+ id = sa .Column (sa .Integer , primary_key = True )
188+ name = sa .Column (sa .String (50 ), nullable = False )
189+
190+ class Product (db .Model ): # type: ignore[no-redef]
191+ __bind_key__ = "db1"
192+ id = sa .Column (sa .Integer , primary_key = True )
193+ name = sa .Column (sa .String (50 ), nullable = False )
194+
195+ db .create_all ()
196+
197+ db .session .execute (User .__table__ .insert (), [{"name" : "User1" }, {"name" : "User2" }])
198+ db .session .commit ()
199+ users = db .session .execute (db .select (User )).scalars ().all ()
200+ assert len (users ) == 2
201+
202+ db .session .execute (
203+ Product .__table__ .insert (), [{"name" : "Product1" }, {"name" : "Product2" }]
204+ )
205+ db .session .commit ()
206+ products = db .session .execute (db .select (Product )).scalars ().all ()
207+ assert len (products ) == 2
0 commit comments