Python 使用多个数据库和单个sqlalchemy模型

Python 使用多个数据库和单个sqlalchemy模型,python,sqlalchemy,Python,Sqlalchemy,我想使用多个数据库引擎和一个sqlalchemy数据库模型 以下情况: 我有一个相册软件(python),不同的相册存储在不同的文件夹中。每个文件夹中都有一个单独的sqlite数据库,其中包含有关照片的其他信息。我不想使用单一的全局数据库,因为通过这种方式,我可以简单地在文件夹中移动、删除和复制相册。 打开一张专辑相当简单: 创建数据库会话: maker = sessionmaker(autoflush=True, autocommit=False, exten

我想使用多个数据库引擎和一个sqlalchemy数据库模型

以下情况: 我有一个相册软件(python),不同的相册存储在不同的文件夹中。每个文件夹中都有一个单独的sqlite数据库,其中包含有关照片的其他信息。我不想使用单一的全局数据库,因为通过这种方式,我可以简单地在文件夹中移动、删除和复制相册。 打开一张专辑相当简单:

创建数据库会话:

maker = sessionmaker(autoflush=True, autocommit=False,
                 extension=ZopeTransactionExtension())
DBSession = scoped_session(maker)
数据库模型的基类和元数据:

DeclarativeBase = declarative_base()
metadata = DeclarativeBase.metadata
定义数据库模型(简称):

最后打开连接:

engine = engine_from_config(config, '...')
DBSession.configure(bind=engine)
metadata.bind = engine
这对于打开一张专辑非常有效。现在我想同时打开多个相册(和db连接)。每个相册都有相同的数据库模型,所以我希望可以重用它。我的问题是模型类定义是从连接到元数据和数据库引擎的声明性基继承的。我想用不同的引擎将这些类连接到不同的元数据。这可能吗


注意:我还想通过ORM查询数据库,例如DBSession.query(Picture).all()(或DBSession[0],…用于不同数据库上的多个会话-因此不是一个查询用于所有数据库中的所有图片,而是一个ORM样式的查询用于查询一个数据库)

您可以通过多个引擎和会话来实现这一点(您不需要多个元数据):

对于
作用域\u会话
,您也可以创建多个

engine1 = create_engine("sqlite:///tmp1.db")
engine2 = create_engine("sqlite:///tmp2.db")
Base.metadata.create_all(bind=engine1)
Base.metadata.create_all(bind=engine2)
Session1 = scoped_session(sessionmaker(bind=engine1))
Session2 = scoped_session(sessionmaker(bind=engine2))
session1 = Session1()
session2 = Session2()
...
如果需要打开的数据库数量可变,
scoped_session
可能有点麻烦。您需要某种方法来跟踪它们

engine1 = create_engine("sqlite:///tmp1.db")
engine2 = create_engine("sqlite:///tmp2.db")
Base.metadata.create_all(bind=engine1)
Base.metadata.create_all(bind=engine2)
session1 = Session(bind=engine1)
session2 = Session(bind=engine2)
print(session1.query(Picture).all())  # []
print(session2.query(Picture).all())  # []
session1.add(Picture())
session1.commit()
print(session1.query(Picture).all())  # [Picture]
print(session2.query(Picture).all())  # []
session2.add(Picture())
session2.commit()
print(session1.query(Picture).all())  # [Picture]
print(session2.query(Picture).all())  # [Picture]
session1.close()
session2.close()
engine1 = create_engine("sqlite:///tmp1.db")
engine2 = create_engine("sqlite:///tmp2.db")
Base.metadata.create_all(bind=engine1)
Base.metadata.create_all(bind=engine2)
Session1 = scoped_session(sessionmaker(bind=engine1))
Session2 = scoped_session(sessionmaker(bind=engine2))
session1 = Session1()
session2 = Session2()
...