我创建了一个使用elixir/sqlalchemy存储数据的Python应用程序。软件的第二个版本需要更新之前版本中创建的任何文件,以添加/删除表和列。
我的问题是:我该如何实现这一点?我知道sqlalchemy-migrate,但是我必须说我觉得它很难理解。它没有提到现有数据会发生什么变化。此外,sqlite对ALTER TABLE支持进行了缩减,那么如果我尝试删除列,迁移会发生什么?是否有其他方法来使用migrate?
我创建了一个使用elixir/sqlalchemy存储数据的Python应用程序。软件的第二个版本需要更新之前版本中创建的任何文件,以添加/删除表和列。
我的问题是:我该如何实现这一点?我知道sqlalchemy-migrate,但是我必须说我觉得它很难理解。它没有提到现有数据会发生什么变化。此外,sqlite对ALTER TABLE支持进行了缩减,那么如果我尝试删除列,迁移会发生什么?是否有其他方法来使用migrate?
你所谈论的是一个众所周知且相当复杂的问题。它被称为数据库迁移。每个好的项目都有一些政策,描述如何应用数据库模式和数据变化来推进从一个产品版本到另一个版本。
许多框架,例如Django或Ruby on Rails,具有内置的或可用作插件的迁移系统。使用SQLAlchemy的情况有几个选项:
/tmp/migrate.sql
文件,写下ALTER/DROP/CREATE语句,祈祷一下,然后应用到你的SQLite数据库中。这通常是一个坏主意,因为容易出错,但选择权在于你。缺少完整功能的 ALTER TABLE
语句可以通过创建具有所需属性的新列,使用临时名称,将所有数据从原始列复制到它,删除原始列,并将新列重命名为原始名称来解决。同样的技术也可以用于表级别。您问到如果尝试删除列,SQLAlchemy-migrate会执行什么操作。它将删除该列并删除其中的任何数据。表中的其他列将保持不变。