sqlalchemy lookup tables

前端 未结 3 1140
忘了有多久
忘了有多久 2021-01-07 13:47

Hi I have a table in 3NF form

ftype_table = Table(
    \'FTYPE\',
    Column(\'ftypeid\', Integer, primary_key=True),
    Column(\'typename\', String(50)),
          


        
相关标签:
3条回答
  • 2021-01-07 14:20

    Just create a cache of FileType objects, so that the database lookup occurs only the first time you use a given file type:

    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']
    

    should work, modulo typos.

    0 讨论(0)
  • 2021-01-07 14:31

    the UniqueObject recipe is the standard answer here: http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject . The idea is to override the creation of File using either __metaclass__.call() or File.__new__() to return the already-existing object, from the DB or from cache (the initial DB lookup, if the object isn't already present, is obviously unavoidable unless something constructed around MySQL's REPLACE is used).

    edit: since I've been working on the usage recipes, I've rewritten the unique object recipe to be more portable and updated for 0.5/0.6.

    0 讨论(0)
  • 2021-01-07 14:38

    Since declarative_base and zzzeek code does not work with sqlalchemy 0.4, I used the following cache so that new objects also stay unique if they are not present in the db

    class FileTypeCache(dict):
        def __missing__(self, key):
            try:
              obj = self[key] = Session.query(FileType).filter_by(typename=key).one()
              return obj
            except InvalidRequestError:
              return obj=self[key]= FileType(key)
              return obj
    

    override eq of 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 讨论(0)
提交回复
热议问题