Если C ++ 11 доступен для вас, компилятор иногда может выполнить задачу для вас:)
constexpr std::uint64_t lssb(const std::uint64_t value)
{
return !value ? 0 : (value % 2 ? 1 : lssb(value >> 1) + 1);
}
Результат - это индекс на основе 1.
Так как код declarative_base и zzzeek не работает с sqlalchemy 0.4, я использовал следующий кеш, чтобы новые объекты также оставались уникальными, если они не присутствуют в классе db
FileTypeCache (dict) : def __missing __ (self, key): try: obj = self [key] = Session.query (FileType) .filter_by (typename = key) .one () return obj кроме InvalidRequestError: return obj = self [key] = FileType ( key) return obj
переопределить eq из FileType
class FileType (object): def __init __ (self, typename) self.typename = typename def __eq __ ( self): if isinstance (other, FileType): return self.typename == other.typename else: return False
Просто создайте кеш объектов FileType, чтобы поиск базы данных происходил только в первый раз, когда вы используете данный тип файла:
class FileTypeCache (dict): def __missing __ (self, key): obj = self [key] = Session.query (FileType) .filter_by (typename = key) .one () return obj filetype_cache = FileTypeCache () file = File () file.size = 10 file.filetype = filetype_cache ['PPT']
должен работать, по модулю опечаток.
__ missing __
не обновляет кеш с новым значением, 2) вручную кэшированные объекты должны обрабатываться с осторожностью, когда они удаляются из сеанса.
– Denis Otkidach
27 December 2009 в 18:39
рецепт UniqueObject является стандартным ответом здесь: http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject . Идея состоит в том, чтобы переопределить создание File
, используя либо __ metaclass __. Call ()
, либо File .__ new __ ()
, чтобы вернуть уже существующий объект , из БД или из кеша (исходный поиск БД, если объект еще не присутствует, явно неизбежен, если не используется нечто, построенное вокруг REPLACE MySQL).
edit: поскольку я работал в рецептах использования я переписал уникальный рецепт объекта, чтобы быть более портативным и обновленным для 0.5 / 0.6.