sqlalchemy自动加载orm持久性

use*_*502 6 python orm caching sqlalchemy autoload

我们使用sqlalchemy的自动加载功能来进行列映射,以防止我们的代码中出现硬编码.

class users(Base):
    __tablename__ = 'users'
    __table_args__ = {
        'autoload': True,
        'mysql_engine': 'InnoDB',
        'mysql_charset': 'utf8'
    }
Run Code Online (Sandbox Code Playgroud)

有没有办法序列化或缓存自动加载的元数据/ orms,所以每次我们需要从其他脚本/函数引用我们的orm类时,我们不必经历自动加载过程?

我看过烧杯缓存和泡菜,但是如果有可能或怎么做的话,还没有找到明确的答案.

理想情况下,只有在我们提交了对数据库结构的更改但是从所有其他脚本/函数引用数据库映射的非自动加载/持久/缓存版本时,才会运行自动加载映射脚本,

有任何想法吗?

use*_*502 6

我现在正在做的是在通过数据库连接(MySQL)运行反射之后挑选元数据,并且一旦pickle可用,使用pickle元数据来反映具有绑定到SQLite引擎的元数据的模式.

cachefile='orm.p'
dbfile='database'
engine_dev = create_engine(#db connect, echo=True)
engine_meta = create_engine('sqlite:///%s' % dbfile,echo=True)
Base = declarative_base()
Base.metadata.bind = engine_dev
metadata = MetaData(bind=engine_dev)

# load from pickle 
try:
    with open(cachefile, 'r') as cache:
        metadata2 = pickle.load(cache)
        metadata2.bind = engine_meta
        cache.close()
    class Users(Base):
        __table__ = Table('users', metadata2, autoload=True)

    print "ORM loaded from pickle"

# if no pickle, use reflect through database connection    
except:
    class Users(Base):
        __table__ = Table('users', metadata, autoload=True)

print "ORM through database autoload"

# create metapickle
metadata.create_all()
with open(cachefile, 'w') as cache:
    pickle.dump(metadata, cache)
    cache.close()
Run Code Online (Sandbox Code Playgroud)

任何评论,如果这是好的(它的工作)或有什么我可以改善?

  • 你可以简化这个只是为了使用一个MetaData对象,并且只是做一个简单的"如果os.path.exists(cachefile)"来确定你是否正在进行unpickling."表('用户',元数据,自动加载=真)"这样只需要说明一次,因为如果表已经在MetaData中,您已经看到它会跳过反射. (2认同)