Контекстно-зависимая функция SQLAlchemy для создания составного значения при вставке и обновлении - PullRequest
3 голосов
/ 06 сентября 2010

Я пытаюсь разобраться, как добавить контекстно-зависимую функцию (например, def get_user_full_name ()), которая будет запускаться из спецификаций по умолчанию и onupdate для столбца.Я пытаюсь установить составное поле, которое объединяет имена и фамилии в одно полное имя, чтобы избежать необходимости постоянно объединять два поля во всех запросах.

Я использую декларативный подход.Это пример похожей модели:

class SomeMembers(Base):
    __tablename__ = 'some_members'
    __table_args__ = {'mysql_engine':'InnoDB'}

    SomeGroup = Column(Unicode(50), primary_key=True)
    UserID = Column(Unicode(50), primary_key=True)
    FullName = Column(Unicode(255), default=get_user_full_name, onupdate=get_user_full_name, index=True)
    FirstName = Column(Unicode(255), index=True)
    LastName = Column(Unicode(255), index=True)
    UserName = Column(Unicode(255))

Это написанная мной функция, которая сообщает в трассировке стека, что ни ключи FirstName, ни LastName не действительны:

def get_user_full_name(context):
    return " ".join((context.compiled_parameters[0]['FirstName'],context.compiled_parameters[0]['LastName']))

Мне не ясно, как я могу сослаться на две колонки (FirstName и LastName) существующих данных, чтобы создать составное значение для хранения для удобства поиска.Например, если у меня был пользователь по имени Джон Доу, метод get_user_full_name должен принимать «Джон» и «Доу» и возвращать полное имя «Джон Доу».

В документации это относится к context.current_parameters, но в моем случае его не существует.Я подозреваю, что это потому, что мы используем декларативный подход.Если бы это сработало, моя функция get_user_full_name выглядела бы так:

def get_user_full_name(context):
    return " ".join((context.current_parameters['FirstName'],context.current_parameters['LastName']))

Я знаю, что это, вероятно, тривиально, но я не могу взломать код, где хранится эта информация и как получить к ней динамический доступ.1016 *

Небольшое понимание будет высоко ценится.Я также открыт для более элегантного подхода.

Заранее спасибо ...

Приветствия,

Пол

1 Ответ

0 голосов
/ 02 марта 2011

Я попробовал следующее выражение:

from sqlalchemy.sql.expression import column, literal, literal_column

Column('full_name', String, onupdate=literal_column("first_name") + literal(" ") + literal_column("last_name"))

Это вроде работает, но обновляет full_name с предыдущими значениями first_name и last_name.Использование column дает тот же результат.

Будет ли выполнять работу столбец составной ?

...