Я работаю с базой данных MSSQL без контроля над настройкой БД или данными (только для чтения) в ней.Одна таблица представлена в SQLAlchemy следующим образом:
class pdAnlage(pdBase):
__tablename__ = "Anlage"
typ = Column(CHAR(4), primary_key=True)
nummer = Column(CHAR(4), primary_key=True)
При доступе к базе данных мне нужно свойство "name", которое представляет собой просто сочетание "typ" и "nummer" с точкой между ними.Итак, я сделал это:
@hybrid_property
def name(self):
return self.typ + '.' + self.nummer
Выглядит просто и работает как положено.Есть два предостережения, одно общее и одно особое.Общее: таблица довольно большая, и я хотел бы делать запросы к Anlage.name, например:
db.query(Anlage).filter(Anlage.name.like('A%.B'))
db.query(Anlage).filter(Anlage.name == 'X.Y')
Это работает, но неэффективно, так как сначала SQL-сервер должен объединить всестолбцы «typ» и «nummer» (большой) таблицы перед выполнением теста.Итак, я определил методы класса, подобные этому:
@classmethod
def name_like(self, pattern):
p = pattern.split('.', 2)
if len(p) == 1 or not p[1]:
return self.typ.like(p[0])
else:
return and_(self.typ.like(p[0]), self.nummer.like(p[1]))
Это не элегантно, но отлично справляется со своей задачей.Было бы лучше перегрузить «==» и «like ()», есть ли способ сделать это?
Теперь к особому случаю: столбцы name и typ могут содержать конечные пробелы в БД.Но у свойства name не должно быть пробелов, особенно перед точкой.Поэтому я попытался переписать гибридное свойство name следующим образом:
@hybrid_property
def name(self):
return self.typ.rstrip() + '.' + self.nummer.rstrip()
Это не работает, потому что SQLAlchemy не знает, как преобразовать метод python rstrip () в функцию MSSQL RTRIM ().Как мне это сделать?