7

sqlalchemy の autoload 機能を使用して列マッピングを行い、コードのハードコーディングを防ぎます。

class users(Base):
    __tablename__ = 'users'
    __table_args__ = {
        'autoload': True,
        'mysql_engine': 'InnoDB',
        'mysql_charset': 'utf8'
    }

他のスクリプト/関数から orm クラスを参照する必要があるたびに自動ロード プロセスを実行する必要がないように、自動ロードされたメタデータ/orms をシリアル化またはキャッシュする方法はありますか?

ビーカーのキャッシングとピクルを見てきましたが、それが可能かどうか、またはその方法について明確な答えが見つかりませんでした。

理想的には、データベース構造に変更をコミットしたが、他のすべてのスクリプト/関数からデータベース マッピングの非 autoload/persistent/cached バージョンを参照する場合にのみ、autoload マッピング スクリプトを実行します。

何か案は?

4

2 に答える 2

6

私が今行っているのは、データベース接続 (MySQL) を介してリフレクションを実行した後にメタデータをピクルすることです。ピクルが利用可能になったら、そのピクルされたメタデータを使用して、メタデータが 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()

これで問題ない (動作する) または改善できる点がある場合、何かコメントはありますか?

于 2012-08-03T13:37:11.203 に答える