[英]Update an sqlite database schema with sqlalchemy and elixir
我創建了一個python應用程序,它使用elixir / sqlalchemy來存儲數據。 軟件的第二個版本要求更新在先前版本中創建的任何文件,以便添加/刪除表和列。
我的問題是:我怎樣才能做到這一點? 我知道sqlalchemy-migrate ,但我必須說我發現它令人困惑。 它沒有提到現有數據會發生什么。 此外,sqlite 減少了ALTER TABLE支持 ,因此如果我嘗試刪除列,將會遷移什么? 有沒有其他方法可以使用遷移?
你所談論的是一個眾所周知且非常復雜的問題。 它被稱為數據庫遷移。 每個好的項目都有一些策略描述了應該如何應用數據庫模式和數據突變以從一個產品版本推進到另一個產品版本。
許多框架(如Django或Ruby on Rails)都內置了遷移系統或作為插件提供。 SQLAlchemy的案例很少:
/tmp/migrate.sql
,記下ALTER / DROP / CREATE語句,交叉指針並將其應用到SQLite基礎。 這通常是一個壞主意,因為它容易出錯,但選擇取決於你。 缺少全功能的ALTER TABLE
語句可以通過創建具有臨時名稱的所需屬性的新列,將原始列中的所有數據復制到其中,刪除原始列以及將新列重命名為原始名稱來解決。 可以在表級使用相同的技術。 並且您已經詢問過如果您嘗試刪除列,SQLAlchemy-migrate將執行的操作。 好吧,它會刪除一列,因此刪除其中的任何數據。 表中的其他列將保持不變。
sqlalchemy-migrate的最新替代品是alembic ,由SQLAlchemy本人的作者編寫。 雖然后者(“同一作者”)看起來像一個強有力的論點,但缺點是它不支持SQLite的表更改,即它沒有SQLite缺少ALTER支持的內置變通方法。 (有人可能認為這超出了范圍,可以通過專門的python包或SQLite擴展來解決。)
你在sqlalchemy-migrate中迷惑了什么? 它有--preview_sql和--preview_py選項來預覽它將要做的事情。 通常,對於任何可能的情況都不可能進行正確的遷移,但您可以修改生成的遷移腳本以滿足您的需求。 通過嘗試,很容易得到其余的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.