@Paymir121

Как можно работа одним orm классом для разных БД в sqlalchemy?

Используя SQLAlchemy необходимо сделать кеш-бд на sqlite, основная БД postgres. Но как известно sqlite не поддерживает тип данных ARRAY с чем есть трудности. Как можно заставить их подружится, не писав 2 разных класса.


Получилось сделать это переводя все в битовую запись и обратно, но тогда в postgres будет хранится в битовой форме, что плохо:

class Properties(Base):
    __tablename__ = 'properties'

    id = Column(Integer, primary_key=True)

     name = Column(BytesArray(PickleType), nullable=True)

class BytesArray(TypeDecorator):
    impl = LargeBinary

    def process_bind_param(self, value, dialect):
        return pickle.dumps(value, 0)

    def process_result_value(self, value, dialect):
        return pickle.loads(value)

Есть ли какой то вариант ? Совсем замучался с orm-классами
  • Вопрос задан
  • 64 просмотра
Решения вопроса 1
@Paymir121 Автор вопроса
Получилось, может кому поможет, то 2 дня искал информацию
class BytesArray(TypeDecorator):
    impl = LargeBinary

    def load_dialect_impl(self, dialect):
        if dialect.name == 'sqlite':
            return dialect.type_descriptor(LargeBinary)
        else:
            return dialect.type_descriptor(ARRAY(JSON))

    def process_bind_param(self, value, dialect):
        if dialect.name == 'sqlite':
            return pickle.dumps(value, 0)
        return value

    def process_result_value(self, value, dialect):
        if dialect.name == 'sqlite':
            return pickle.loads(value)
        return value
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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