2009-05-15 38 views
7

假設我有一個engine指着MySQL數據庫:如何在SQLAlchemy的引擎的SQL方言中使用DDL生成文件?

engine = create_engine('mysql://arthurdent:[email protected]/dtdb', echo=True) 

我可以填充dtdb有桌子,FKS等人:

metadata.create_all(engine) 

有一種簡單的方法來生成包含SQL文件所有的DDL語句,而不是實際將這些DDL語句應用到dtdb

到目前爲止,我已經採取捕獲由echo=True產生的SQLAlchemy日誌輸出,並手動編輯它。但這太痛苦了。

它看起來像SA有非常複雜的模式管理API,但我還沒有看到簡單地將模式定義作爲文本流式傳輸的示例。

回答

13

快速回答是在SQLAlchemy 0.8 FAQ

在0.8 SQLAlchemy中你需要做

engine = create_engine(
'mssql+pyodbc://./MyDb', 
strategy='mock', 
executor= lambda sql, *multiparams, **params: print (sql.compile(dialect=engine.dialect))) 

在0.9 SQLAlchemy中的語法簡化。

engine = create_engine(
'mssql+pyodbc://./MyDb', 
strategy='mock', 
executor= lambda sql, *multiparams, **params: print (sql) 

較長的答案是捕獲輸出仍然有一些輕微的問題。就像類型文字的編碼一樣。但是這對於任何人來說都不是一個足夠大的問題,無法加強和抓住他們的癢。您始終可以讓SQLAlchemy以編程方式創建一個空數據庫並從那裏轉儲SQL。

更困難的問題是處理模式遷移。這是SQLAlchemy-migrate可以幫助你的地方。

+0

該FAQ鏈接是我所需要的,謝謝! :) 我不是在尋找像遷移一樣的模式管理。簡而言之,我需要一個簡單的入侵手段來抓取DDL,而不需要使用引擎回聲輸出。 – 2009-05-15 21:53:36

+0

這在Python 0.9中似乎已經改變了。另外,FAQ似乎不存在0.9。 – 2015-01-05 20:15:41

+0

第二種語法在SQLAlchemy 1.0.12中無法使用 - 請參閱https://groups.google.com/d/topic/sqlalchemy/r9neOsc64wc/discussion – 2016-05-11 12:04:14