migrate.py 文件源码

python
阅读 22 收藏 0 点赞 0 评论 0

项目:peewee-versioned 作者: kramer65 项目源码 文件源码
def _rename_table(operation, migrator, introspector, old_name, new_name):
    version_old_name = old_name + 'version'
    version_new_name = new_name + 'version'

    # save all of the foreign key references
    models = introspector.generate_models()
    OldVersion = models[version_old_name]

    # The name of the original record's primary key
    to_field_name = OldVersion._original_record.to_field.name

    version_id__original_id = []
    for version in OldVersion.select(OldVersion._id, OldVersion._original_record):
        version_id__original_id.append((version._id, version._original_record_id))

    # drop the foreign key field in the OldVersion model
    drop_field = Operation(migrator, 'drop_column', version_old_name, '_original_record_id')
    drop_field.run()

    # rename the original table
    operation.run()
    # rename the version table
    version_rename_table = Operation(migrator, 'rename_table', version_old_name, version_new_name)
    version_rename_table.run()

    # lookup the new model so we can add a foreign key to it
    models = introspector.generate_models()
    NewModel = models[new_name]

    # Add a new Foregin key reference
    _original_record = ForeignKeyField(
        NewModel, null=True, on_delete="SET NULL",
        to_field=getattr(NewModel, to_field_name)
    )
    add_foregin_key = Operation(migrator, 'add_column', version_new_name, '_original_record_id', _original_record)
    add_foregin_key.run()

    # load the new version model with the foregin key
    models = introspector.generate_models()
    NewModel = models[new_name]
    NewVersionModel = models[version_new_name]

    # re link all versions
    for _id, _original_record_id in version_id__original_id:
        version = NewVersionModel.get(NewVersionModel._id == _id)
        # ``to_field_name`` is the name of the original record's primary key
        model = NewModel.get(getattr(NewModel, to_field_name) == _original_record_id)
        version._original_record = model
        version.save()
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号