我從SQLAlchamy的文檔和教程中努力學習了一些東西。SQLAlchamy數據庫構建與重用
我看到如何從數據庫表中自動加載類,並且看到如何設計類並從中創建(通過聲明或使用mapper())添加到數據庫的表。
我的問題是如何編寫既創建表(例如第一次運行)又重新使用它的代碼?
我不想用一個工具或一段代碼創建數據庫,並使用單獨的代碼來使用數據庫。
由於提前, 彼得
我從SQLAlchamy的文檔和教程中努力學習了一些東西。SQLAlchamy數據庫構建與重用
我看到如何從數據庫表中自動加載類,並且看到如何設計類並從中創建(通過聲明或使用mapper())添加到數據庫的表。
我的問題是如何編寫既創建表(例如第一次運行)又重新使用它的代碼?
我不想用一個工具或一段代碼創建數據庫,並使用單獨的代碼來使用數據庫。
由於提前, 彼得
create_all()
如果表格已經存在,則不會執行任何操作,所以只要您設置了引擎或連接,就立即調用它。
(請注意,如果您改變你的表模式,create_all()
將不更新,所以你仍然需要「另一個程序」這樣做!)。
這是通常的模式:
def createEngine(metadata, dsn, **args):
engine = create_engine(dsn, **args)
metadata.create_all(engine)
return engine
def doStuff(engine):
res = engine.execute('select * from mytable')
# etc etc
def main():
engine = createEngine(metadata, 'sqlite:///:memory:')
doStuff(engine)
if __name__=='__main__':
main()
我想你也許過度思考的情況。如果您要重新創建數據庫,通常只需撥打Base.metadata.create_all()
或同等電話號碼,如果您不想這樣做,則不會調用它。
您可以嘗試每次調用它,並在出現錯誤時處理異常(假定數據庫已經設置好)。
或者您可以嘗試查詢某個表,如果失敗,請致電create_all()
將所有內容置於正確的位置。
無論您是否執行數據庫創建,您的應用的其他部分都應以相同的方式工作。
謝謝,這使得sence ...第一個地方沒有問題需要解決! – user1247965 2012-03-05 01:59:01
謝謝 - 我想我正在尋找一個解決方案來解決一個不存在的問題。什麼是最佳實踐解決方案,自動加載或明確定義類?前者似乎保證數據庫和對象相匹配,但後者會在代碼中指定對象而不是「通過魔術」。 – user1247965 2012-03-05 02:02:17
如果您的應用程序「擁有」數據庫(即爲其創建了該數據庫),則在代碼中明確表格結構。如果應用程序僅僅使用現有的數據庫,那麼通過任何方式自動加載。請注意,在任何情況下,仍然不能保證表結構將與您的應用程序的期望相匹配。如果架構與預期的不同,您的應用可能會在兩種情況下中斷。 – 2012-03-05 02:18:51