使用peewee_migrate来进行数据库结构的自动迁移
来源:互联网 发布:交换机端口上的ip 编辑:程序博客网 时间:2024/05/29 02:24
因为工作需要,使用的orm工具为peewee。peewee号称轻量级的orm,果然不假,核心代码就四千多行,也满足了工作的基本要求。可是peewee不像SQLAlchemy有alembic或者Django有South,peewee没有自动对数据库进行DDL语句升级的工具。其在playhouse自带了一个手动的migrator,留着以后扩展用的。但身为程序员怎么能忍受手动的事情呢?本着能躺着就不坐着的心态,能自动的就让他自动呗。于是上github搜索,果不其然,人家已经造好轮子了,peewee_migrate。今天就来聊聊怎么使用它,具体文档他的github也有,大家可以自行去看看。
首先我们先用peewee创建一个model.py:
import peewee as pwdb = pw.MySQLDatabase( host='127.0.0.1', user='root', passwd='password', database='pw_migrate', charset='utf8')class BaseModel(pw.Model): class Meta: database = dbclass Person(BaseModel): name = pw.CharField() birthday = pw.DateField() is_relative = pw.BooleanField()class Pet(BaseModel): owner = pw.ForeignKeyField(Person, related_name='pets') name = pw.CharField() animal_type = pw.CharField()
然后我们使用peewe_migrate来创建表pw_migrate.py:
import modelfrom peewee_migrate import Routermodel.db.connect()router = Router(model.db)router.create(auto=model)router.run()model.db.close()
运行pw_migrate.py,会生成一个001_auto.py的文件,用于迁移的。上面的命令中就是用router.create(auto=model)来生成这个文件的。然后使用router.run()来操作数据库,生成相应的表。其中生成的表中有一张名为migratehistory,是用来记录你迁移成功了哪些文件。如果你按我上面那样进行,如无意外会有多一张表:basemodel,很明显我们并不想要生成他,所以可以这样做。
router = Router(model.db, ignore='basemodel')
这样便不会生成basemodel这张表,当然peewe_migrate 也提供rollback功能:
router.rollback('001_auto')
如果你在上一步生成了basemodel这张表会无法rollback的,只能注释调001_auto.py文件的相应部分,并且手动删除这张表。
讲了这么多,才到我们真正主要的部分,自动迁移。跟alembic或者South一样,你只需要修改你的model部分就可以进行迁移了。
class Pet(BaseModel): owner = pw.ForeignKeyField(Person, related_name='pets') name = pw.CharField() animal_type = pw.CharField() birthday = pw.DateField(null=True)
在运行pw_migrate.py原来的pet表就会多了birthday字段了。一切如此简单,真是惬意。当然peewee_migrate的代码也写的很不错,并且代码量不多,如果你对peewee足够熟悉可以上去阅读学习。
另外,如果你的数据库已经有了数据,且不想删除它,可以这样:
router.run(fake=True)
这样可以避免重复创建已有表的错误。
当然peewee_migrate还在不断进行维护和更新当中,使用过程中会不少bug,比如说,尚未支持联合外键的创建字段的约束也无法自动生成,当然像rename这些都是要手动的,不然会导致数据的丢失,因为自动生成的操作是删除旧的字段,重新生成你所重命名的字段。如果使用 from peewee import * 也会迁移失败。还有现在还不支持外键的更改,主要是peewee那边的外键更改支持有bug。
在我fork的分支上针对mysql支持的以上的内容,github。当然你要配套里面的peewee才能支持外键更改,另外对DateField支持datetime.datetime.now的创建。
- 使用peewee_migrate来进行数据库结构的自动迁移
- 使用rman进行数据库迁移
- 使用NBU进行数据库迁移
- django数据库表结构自动迁移
- 使用mysql mysqldump进行数据库迁移
- 使用Gradle整合Flyway进行数据库迁移
- Spring中使用HibernateDaoSupport来进行数据库的操作
- Entity Framework Core 2.0 使用代码进行自动迁移
- 使用传输表空间的方法来迁移oracle 数据库从SPARC到X86-64
- Sql Server数据库向Oracle数据库的迁移数据库结构
- 启用数据库自动迁移
- 使用South对Django项目的数据库进行迁移的简明教程
- 如何使用ANT自动进行数据库的相关操作
- 如何使用ANT自动进行数据库的相关操作
- 如何使用ANT自动进行数据库的相关操作
- 如何使用ANT自动进行数据库的相关操作
- 使用XTTS增量进行HP Unix到Soalris Sparc的数据库迁移
- 使用SqlBulkCopy进行数据大批量的迁移
- android 设置状态栏的颜色
- C++拷贝构造函数
- AndroidStudio实现第三方QQ分享,空间分享
- jQuery 插件学习笔记
- JavaScript初步了解
- 使用peewee_migrate来进行数据库结构的自动迁移
- RESTful架构理解
- Linux下安装mongodb
- TensorFlow学习笔记(二)---MNIST代码分析
- 机器学习面试题
- 周易六十四卦——火水未济卦
- maven版本对应jdk版本的要求
- C++虚继承
- 面试题:(考察闭包,this指向,预解析,函数执行顺序等知识点)