2017-07-27 85 views
0

我使用SQLAlchemy的,遷移來管理我的PostgreSQL數據庫遷移時刪除數據。我改變了__tablename__一個模型,並在運行遷移數據庫中更改了名稱,但在表中的所有行被刪除。如何在不刪除數據的情況下重命名模型?SQLAlchemy的,遷移重命名模型

class Contract(db.Model): 
    __tablename__ = 'contract' 
    id = db.Column(db.Integer, primary_key=True) 
    is_valid = db.Column(db.Boolean, default=IS_VALID) 

我從contract重命名爲contracts,並得到此遷移:

def upgrade(migrate_engine): 
    pre_meta.bind = migrate_engine 
    post_meta.bind = migrate_engine 
    pre_meta.tables['contract'].drop() 
    post_meta.tables['contracts'].create() 

它刪除舊錶,並創建一個新的。我從未檢查過其他遷移腳本,因爲它們始終運行而不丟棄數據。

+2

請包括您的(相關)定義,包括您的更改之前和之後以及您使用的遷移。換句話說,產生[mcve]。這聽起來像是你已經在類構造完成之後試圖在實時系統中爲模型類「__tablename__」屬性分配一個新值。正如你已經想出的那樣,這將不起作用,因爲相應的'Table'對象是在類構造期間由Declarative構造的。重命名PostgreSQL中的表很簡單,並且不需要任何下降:'ALTER TABLE the_table重命名爲another_table;'。 –

回答

2

SQLAlchemy的,遷移不知道,在數據庫中名爲「合同」表是一樣的命名代碼中的「合同」的模式。它們是不同的名稱,它只是做一個簡單的比較。這就是爲什麼你總是審查生成的遷移腳本,以確保他們做正確的事情。

SQLAlchemy-Migrate docs,重命名與rename方法的表。

pre_meta.tables['contract'].rename('contracts') 

如果您正在使用蒸餾器,而不是SQLAlchemy的,遷移,同樣的事情發生。使用rename_table方法。

op.rename_table('contract', 'contracts')