Peewee不使用Proxy能否在main.py中实现同一模型对接多个数据库?
可以不使用Proxy实现该需求,核心实现思路是运行时动态绑定模型类的数据库属性,配合封装即可实现你期望的sqlite_1.add_user(name="Jerry")调用形式,无需每次切换数据库时重复初始化模型。
实现代码
1. 调整database.py(移除Proxy依赖)
# database.py import peewee as pw # 基类先不绑定具体数据库,留待后续动态绑定 class BaseModel(pw.Model): class Meta: pass class User(BaseModel): name = pw.CharField()
2. main.py完成多数据库初始化与封装
# main.py import peewee as pw from database import BaseModel, User # 封装数据库实例与对应操作 class DBInstance: def __init__(self, db_file_path): # 初始化独立数据库连接 self.db = pw.SqliteDatabase(db_file_path) # 绑定模型到当前数据库 self._bind_models() # 初始化表结构 self._init_tables() def _bind_models(self): # 批量绑定所有继承自BaseModel的模型类到当前数据库 for model_cls in BaseModel.__subclasses__(): model_cls.bind(self.db, bind_refs=False, bind_backrefs=False) def _init_tables(self): with self.db: self.db.create_tables([User], safe=True) # 封装业务操作方法 def add_user(self, name): with self.db.atomic(): return User.create(name=name).save() def get_user(self, name): with self.db.atomic(): return User.get(User.name == name) # 初始化多个完全独立的数据库实例 sqlite_1 = DBInstance('sqlite_1.db') sqlite_2 = DBInstance('sqlite_2.db') # 调用形式完全符合要求,两个数据库操作互不干扰 sqlite_1.add_user(name="Jerry") sqlite_2.add_user(name="Jerry")
补充说明
如果不需要封装成实例调用的形式,也可以直接使用Peewee内置的bind_ctx上下文管理器临时绑定模型到指定数据库,实现多数据库切换:
# 极简无封装实现示例 import peewee as pw from database import User sqlite_1 = pw.SqliteDatabase('sqlite_1.db') sqlite_2 = pw.SqliteDatabase('sqlite_2.db') # 操作sqlite_1 with sqlite_1.bind_ctx([User]): sqlite_1.create_tables([User], safe=True) User.create(name="Tom") # 操作sqlite_2 with sqlite_2.bind_ctx([User]): sqlite_2.create_tables([User], safe=True) User.create(name="Jerry")
注意:多线程场景下使用动态绑定方案需要加锁保证绑定操作的原子性,避免多线程同时修改模型绑定的数据库导致数据串库。
内容的提问来源于stack exchange,提问作者flice com
相关产品推荐
相关产品推荐

