我们正在使用sqlalchemy的自动加载功能进行列映射,以防止在我们的代码中进行硬编码。
class users(Base):
__tablename__ = 'users'
__table_args__ = {
'autoload': True,
'mysql_engine': 'InnoDB',
'mysql_charset': 'utf8'
}
是否有一种方法可以序列化或缓存自动加载的元数据/规范,因此我们不必每次需要从其他脚本/函数引用我们的orm类时都经过自动加载过程吗?
我看过烧杯缓存和泡菜,但没有找到明确的答案,如果有可能或如何做。
理想情况下,只有在对数据库结构进行了更改但从所有其他脚本/函数引用了数据库映射的非自动加载/持久/缓存版本后,我们才运行autload映射脚本。
有任何想法吗?
最佳答案
我现在要做的是在通过数据库连接(MySQL)运行反射之后,对元数据进行腌制,一旦有腌菜可用,就使用该腌制的元数据在绑定(bind)了SQLite引擎的元数据上反射(reflect)架构。
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()
如果这还行(有效)或有什么我可以改善的地方,您有什么意见吗?
关于python - sqlalchemy自动加载orm持久性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11785457/