SQLAlchemy вставляет новые записи со многими отношениями [duplicate]

Если C ++ 11 доступен для вас, компилятор иногда может выполнить задачу для вас:)

constexpr std::uint64_t lssb(const std::uint64_t value) { return !value ? 0 : (value % 2 ? 1 : lssb(value >> 1) + 1); }

Результат - это индекс на основе 1.

1
задан Denis Otkidach 27 December 2009 в 18:30
поделиться

3 ответа

Так как код 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  
0
ответ дан locojay 15 August 2018 в 21:50
поделиться

Просто создайте кеш объектов 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']  

должен работать, по модулю опечаток.

0
ответ дан Antoine P. 15 August 2018 в 21:50
поделиться
  • 1
    Это правильное направление, но 1) __ missing __ не обновляет кеш с новым значением, 2) вручную кэшированные объекты должны обрабатываться с осторожностью, когда они удаляются из сеанса. – Denis Otkidach 27 December 2009 в 18:39
  • 2
    К сожалению, исправлена ​​логика кэширования. Спасибо, что заметили. – Antoine P. 28 December 2009 в 07:45

рецепт UniqueObject является стандартным ответом здесь: http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject . Идея состоит в том, чтобы переопределить создание File , используя либо __ metaclass __. Call () , либо File .__ new __ () , чтобы вернуть уже существующий объект , из БД или из кеша (исходный поиск БД, если объект еще не присутствует, явно неизбежен, если не используется нечто, построенное вокруг REPLACE MySQL).

edit: поскольку я работал в рецептах использования я переписал уникальный рецепт объекта, чтобы быть более портативным и обновленным для 0.5 / 0.6.

2
ответ дан zzzeek 15 August 2018 в 21:50
поделиться
  • 1
    Это выглядит великолепно. К сожалению, я использую db2 и застрял с sqlalchemy 0.4.0 Есть ли версия 0.4.0 – locojay 29 December 2009 в 20:53
Другие вопросы по тегам:

Похожие вопросы: