SQLAlchemy, отражение, разные бэкэнды и нечувствительность к регистру таблиц / столбцов - PullRequest
1 голос
/ 21 февраля 2012

Введение: Я пишу веб-интерфейс с отражением SQLAlchemy, который поддерживает несколько баз данных. Получается, что авторы приложения определили postgresql с помощью строчных таблиц / столбцов, например. job.jobstatus , в то время как sqlite имеет смешанный регистр, например, Job.JobStatus . Я использую DeclarativeReflectedBase из примеров для объединения отражения и декларативного стиля.

Проблема: Настройка SQLAlchemy для работы с таблицами / столбцами без учета регистра с отражением

Я уже сделал:

  • Я изменил DeclarativeReflectedBase.prepare () метод для передачи quote = False в Table .__ init __

Что еще предстоит решить:

  • определения отношений по-прежнему должны соответствовать регистру при настройке объединений, например primaryjoin = "Job.JobStatus == Status.JobStatus" .
  • настроить __tablename__ в зависимости от типа двигателя

Вопрос: Верны ли мои предположения или есть более простой способ? Может быть Я мог бы сказать, что отражение отражает все строчные буквы, и все проблемы исчезли.

1 Ответ

1 голос
/ 21 февраля 2012

вы, вероятно, захотите определить «.key» для каждого столбца в нижнем регистре, чтобы вы могли ссылаться на столбцы как нижний регистр в коде приложения.Вы должны использовать событие column_reflect (см. http://docs.sqlalchemy.org/en/latest/core/events.html#schema-events), чтобы определить этот ключ как строчную версию имени.

, тогда, когда вы отразите таблицу, я просто сделаю что-то вроде этого:

def reflect_table(name, engine):
    if engine.dialect.name == 'postgresql':
        name = name.lower()
    return Table(name, autoload=True, autoload_with=engine)

my_table = reflect_table("MyTable", engine)

Я думаю, что это может охватить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...