2012-08-02 27 views
5

我們使用sqlalchemy的自動加載功能來執行列映射,以防止在我們的代碼中進行硬編碼。sqlalchemy自動加載orm持久性

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

有沒有一種方法來序列化或高速緩存自動加載元/奧姆斯所以我們沒有通過自動加載的過程中,每次我們需要從其他腳本/函數參考我們的ORM班時間去?

我看過燒杯緩存和泡菜,但如果可能或如何去做,還沒有找到明確的答案。

理想的情況下,我們只運行autload映射腳本的時候,我們致力於改變我們的數據庫結構,但是從所有其它腳本/函數引用不自動加載/永久/緩存我們的數據庫映射的版本,

任何想法?

+0

爲什麼你不這樣做:在SA中定義完整的模型。作爲一個副作用,這將作爲數據庫模式的源代碼控制。 *當然,這隻適用於你的SA應用程序對你正在使用的數據庫有主要控制* – van 2012-08-03 08:30:06

+0

在我的情況下單獨處理數據庫開發,意味着應用程序不會完全控制。但是,我找到了一種方法來醃製元數據,所以我只需要通過數據庫連接反映一次來創建pickle,這是我使用pickle元數據來反映哪些時間通過db連接(參見下文)所需時間的一小部分。 – user1572502 2012-08-03 13:24:00

回答

5

我現在正在做的是在通過數據庫連接(MySQL)運行反射之後醃製元數據,並且一旦pickle可用,就可以使用該pickled元數據反映模式並將元數據綁定到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() 

任何意見,如果這是正常的(它的工作),或者有什麼我可以改善?

+2

你可能簡化這個只是爲了使用一個MetaData對象,並且只是做一個簡單的「if os.path.exists(cachefile)」來確定你是否不拆除。 「表('用戶',元數據,自動加載=真)」等只需要說明一次,因爲你已經看到它跳過反射,如果表已經在元數據。 – zzzeek 2012-08-06 03:14:36

+1

我認爲在'with'語句中使用時不需要關閉文件,但這沒有關係。你的方法看起來很有趣,它是否按預期工作? – jadkik94 2012-08-15 20:57:34