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

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

Теперь представим вполне реальный сценарий. Есть приложение in production, использующее модуль с моделью данных. Я хочу прогнать тесты с новым функционалом, использующим эту же модель (база, разумеется, другая - тестовая). Получается, что это принципиально невозможно сделать, поскольку наш модуль может работать только с одним подключением. Я правильно понимаю? Есть ли красивый и простой способ обойти это ограничение?
  • Вопрос задан
  • 2824 просмотра
Решения вопроса 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, вполне возможно, что в следующей версии грязные хаки не понадобятся.

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

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

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

Войти через центр авторизации
Похожие вопросы