Универсальный текстовый/тип данных CLOB для кросс-базы данных приложения с SQLAlchemy



Я работаю над веб-приложением Python, которое использует MySQL в качестве бэкенда базы данных в среде разработки и Oracle 11g в производственной среде. Существует ли конкретный способ унифицировать текстовые поля SQLAlchemy, чтобы они работали как на MySQL, так и на Oracle database? Для бэкенда Oracle в моделях я использую sqlalchemy.CLOB и для MySQL sqlalchemy.TEXT.

540   2  

2 ответов:

Согласно @agronholm на #sqlalchemy предполагается использовать универсальный тип SQLAlchemyText (который TEXT является специализацией):

Переменный тип строки.

В SQL обычно соответствует CLOB или тексту. Можно также взять Python объекты unicode и кодирование в кодировку базы данных в bind params (и наоборот для наборов результатов.) В общем случае текстовые объекты не имеют иметь длину; в то время как некоторые базы данных будут принимать аргумент длины вот, так и будет будьте отвергнуты другими.

Я думаю, что с помощью этой официальной документации трюк должен сделать трюк: Overiding Type Compilation. В этом случае я бы сохранил CLOB как оригинал, потому что он используется в производстве, и применил бы компиляцию для mysql:

from sqlalchemy.ext.compiler import compiles
from sqlalchemy.types import CLOB

@compiles(CLOB, "mysql")
def compile_binary_mysql(type_, compiler, **kw):
    return "TEXT"
    # @note: this will handle other parameter such as `length`
    # return compiler.visit_TEXT(type_, **kw)

обратите внимание, что настоятельно рекомендуется использовать одни и те же СУБД для производства/тестирования/разработки, чтобы избежать этих и других проблем.

Comments

    Ничего не найдено.