Автоматически добавлять контрольную сумму SHA-1 для столбца как другого столбца в таблице SQLAlchemy - PullRequest
1 голос
/ 01 июня 2011

Я работаю с базой данных SQLAlchemy.

У меня есть простая схема со столбцами id, data и timestamp.Столбец timestamp автоматически заполняется текущей датой / временем следующим образом:

Column('timestamp', DateTime, nullable=False, default=datetime.now)

Я хочу добавить еще один столбец, содержащий контрольную сумму SHA-1 столбца data.Что-то вроде:

# notice this is INVALID CODE
Column('checksum', String, nullable=False, unique=True,
       default=hashlib.sha1(this_table.data).hexdigest())

Есть какие-нибудь предложения?

Спасибо.

Редактировать:

Самое близкое, к чему я пришел, этоуправлять «автоматизацией» на уровне объекта (в отличие от уровня таблицы).Я просто определяю столбец checksum как

Column('checksum', String, nullable=False, unique=True)

и изменяю конструктор объекта, сопоставленного с этой таблицей, следующим образом:

def __init__(self, data):
 self.data = data
 self.checksum = hashlib.sha1(self.data).hexdigest()

Он работает, как и ожидалось, но мне все еще интересноесть способ сделать это на уровне таблицы (как в timestamp, где я ничего не делаю на уровне объекта, но правильно назначаю текущую дату / время)

1 Ответ

2 голосов
/ 01 июня 2011

SqlAlchemy MapperExtension позволяет вам создавать триггеры / ловушки на стороне кода для событий.

http://www.sqlalchemy.org/docs/06/orm/interfaces.html?

По сути, вам нужно создать before_insert и before_update, которые выполняют дополнительные действия. У меня есть пример, использующий это, чтобы удостовериться, что я копирую содержимое из одного столбца в полнотекстовую индексированную таблицу в другом месте базы данных:

init.py # L269" > https://github.com/mitechie/Bookie/blob/master/bookie/models/init.py#L269

Так что ваше расширение картографа может быть примерно таким:

class DataSHAExtension(MapperExtension):
    def before_insert(self, mapper, connection, instance):
        instance.checksum = hashlib.sha1(instance.data).hexdigest()
    ...

, а затем привязывается к соответствующей модели:

Class Something(Base):
    __tablename__ = 'something'
    __mapper_args__ = {
        'extension': DataSHAExtension()
    }

Это делает вещи декларативным способом. Вы также можете сделать это с помощью команд ручного преобразования.

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