Как реализовать одновременное подключение модели peewee к нескольким БД?

Читая справку по peewee, был поражён способом задания подключения к БД: через встроенный класс метаданных внутри базовой модели. Т.е. в каждый момент времени модель может иметь только ОДНО подключение к базе.

Теперь представим вполне реальный сценарий. Есть приложение in production, использующее модуль с моделью данных. Я хочу прогнать тесты с новым функционалом, использующим эту же модель (база, разумеется, другая - тестовая). Получается, что это принципиально невозможно сделать, поскольку наш модуль может работать только с одним подключением. Я правильно понимаю? Есть ли красивый и простой способ обойти это ограничение?
  • Вопрос задан
  • 2844 просмотра
Решения вопроса 1
@LocNar
Proxy — peewee API#Proxy

В продолжение темы, если грязно эмулировать работу django:
# -*- coding: utf-8 -*-

import peewee

db = peewee.Proxy()
first = peewee.SqliteDatabase('first.db')
second = peewee.SqliteDatabase('second.db')


class Test(peewee.Model):
    name = peewee.CharField()

    class Meta:
        database = db
        db_table = 'test'

    @classmethod
    def using(cls, db):
        cls._meta.database.initialize(db)
        return cls

db.initialize(first)
Test.create_table(fail_silently=True)
db.initialize(second)
Test.create_table(fail_silently=True)

Test.using(first).create(name='Test1')  # Переключились на first
Test.create(name='Test2')  # Используется ранее переключенная база first
Test.using(second).create(name='Test3')  # Переключились на secong
Test.create(name='Test4')  # Пишется в second
Test.using(first).create(name='Test5')
print ','.join([x.name for x in Test.using(first).select()])
# Test1,Test2,Test5
print ','.join([x.name for x in Test.using(second).select()])
# Test3,Test4


Вообще peewee активно развивается и постоянно вводит новые фичи, так что можно написать ему на github, вполне возможно, что в следующей версии грязные хаки не понадобятся.

Но тем не менее до сих пор сомневаюсь в целесообразности подобного поведения в целом.

Ещё возможно алиасы моделей могут иметь свои подключения, но читать сурс или проверять лень.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы