2011-06-01 1 views
1

Я работаю с базой данных SQLAlchemy.Автоматически добавлять контрольную сумму SHA-1 столбца в качестве другого столбца в таблице 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()) 

Любые предложения?

спасибо.

Edit:

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

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

и изменить конструктор объекта отображается в этой таблице, как:

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

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

ответ

2

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/букмекер/модели/INIT .py # L269

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

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

, а затем attched модели уместном:

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

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

+0

Также возглавляет, что SqlAlchemy 0.7 имеет этот рефакторинг в полную базу событий, и вы можете проверить это: http://www.sqlalchemy.org/docs/orm/events.html – Rick

+0

Очень полезное расширение - большое спасибо! – Escualo

Смежные вопросы