Dynamically setting __tablename__ for sharding in SQLAlchemy?

后端 未结 6 1555
我寻月下人不归
我寻月下人不归 2020-12-28 17:11

In order to handle a growing database table, we are sharding on table name. So we could have database tables that are named like this:

table_md5one
table_md5         


        
6条回答
  •  盖世英雄少女心
    2020-12-28 17:40

    Try this

    import zlib
    
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, BigInteger, DateTime, String
    
    from datetime import datetime
    
    BASE = declarative_base()
    ENTITY_CLASS_DICT = {}
    
    
    class AbsShardingClass(BASE):
    
        __abstract__ = True
    
    def get_class_name_and_table_name(hashid):
        return 'ShardingClass%s' % hashid, 'sharding_class_%s' % hashid
    
    def get_sharding_entity_class(hashid):
        """
        @param hashid: hashid
        @type hashid: int
        @rtype AbsClientUserAuth
        """
    
        if hashid not in ENTITY_CLASS_DICT:
            class_name, table_name = get_class_name_and_table_name(hashid)
            cls = type(class_name, (AbsShardingClass,),
                       {'__tablename__': table_name})
            ENTITY_CLASS_DICT[hashid] = cls
    
        return ENTITY_CLASS_DICT[hashid]
    
    cls = get_sharding_entity_class(1)
    print session.query(cls).get(100)
    

提交回复
热议问题