簡體   English   中英

使用sqlalchemy和elixir更新sqlite數據庫模式

[英]Update an sqlite database schema with sqlalchemy and elixir

我創建了一個python應用程序,它使用elixir / sqlalchemy來存儲數據。 軟件的第二個版本要求更新在先前版本中創建的任何文件,以便添加/刪除表和列。

我的問題是:我怎樣才能做到這一點? 我知道sqlalchemy-migrate ,但我必須說我發現它令人困惑。 它沒有提到現有數據會發生什么。 此外,sqlite 減少了ALTER TABLE支持 ,因此如果我嘗試刪除列,將會遷移什么? 有沒有其他方法可以使用遷移?

你所談論的是一個眾所周知且非常復雜的問題。 它被稱為數據庫遷移。 每個好的項目都有一些策略描述了應該如何應用數據庫模式和數據突變以從一個產品版本推進到另一個產品版本。

許多框架(如Django或Ruby on Rails)都內置了遷移系統或作為插件提供。 SQLAlchemy的案例很少:

  1. 不要使用任何系統。 只需手寫一個/tmp/migrate.sql ,記下ALTER / DROP / CREATE語句,交叉指針並將其應用到SQLite基礎。 這通常是一個壞主意,因為它容易出錯,但選擇取決於你。 缺少全功能的ALTER TABLE語句可以通過創建具有臨時名稱的所需屬性的新列,將原始列中的所有數據復制到其中,刪除原始列以及將新列重命名為原始名稱來解決。 可以在表級使用相同的技術。
  2. 使用一些第三方遷移系統,如liquibase Liquibase很酷,設計精良,功能強大,除了一個缺點。 這真的很麻煩。 我為SQLite嘗試過(對於SQLAlchemy是的,但實際上並不重要),並且它沒有做一些非常基本的事情。 我搜索了一個問題,發現它們是已知的錯誤。
  3. 使用你提到的SQLAlchemy-migrate。 它不像它受到啟發的ROR遷移一樣強大,它既不像liquibase那樣強大,但它起作用。 SQLite限制可以以相同的方式解決。

並且您已經詢問過如果您嘗試刪除列,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM