使用alembic进行数据库版本管理

Alembic简介:

SQLAlchemy是一款非常优秀的ORM框架,但是本身没有带数据库版本控制功能,这很不方便,进行开发过程中难免修改数据模型,添加一个表,修改一个字段,都需要手动修改的话就比较费事了,还不如不用SQLAlchemy呢。

在这里介绍一款SQLAlchemy作者写的数据库版本控制工具---Alembic。另外还有一个工具叫做SQLAlchemy-Migrate,在使用过程中感觉Alembic更为灵活。

安装alembic

$ pip3 install alembic

初始化

使用之前,先在项目根目录进行初始化。

$ alembic init alembic

初始化完成后,会生成一个alembic.ini配置文件及一个alembic目录。

 项目目录树

创建模型类

复制代码
#!/usr/bin/env python                       
# -*- coding:utf-8 -*-                      
# File Name    : sb.py                      
# Author       : hexm                       
# Mail         : xiaoming.unix@gmail.com    
# Created Time : 2017-03-29 20:03           

from sqlalchemy import Column, Integer, String, ForeignKey, Date, Table, Text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

Base = declarative_base()

# 用户id对应角色id 多对多
useridToRoleid = Table('useridToRoleid', Base.metadata,
        Column('userid', Integer, ForeignKey('users.id')),
        Column('roleid', Integer, ForeignKey('roles.id')),
    )

# 角色id对应权限id 多对多
roleidToIdentityid = Table('roleidToIdentityid', Base.metadata,
        Column('roleid', Integer, ForeignKey('roles.id')),
        Column('identityid', Integer, ForeignKey('identities.id')),
    )

# 文章id和标签id 多对多
articleidToTagid = Table('articleidToTagid', Base.metadata,
        Column('articleid', Integer, ForeignKey('articles.id')),
        Column('tagid', Integer, ForeignKey('tags.id')),
    )

class User(Base):
    """
    用户表
    """
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    username = Column(String(32), nullable=False, unique=True)
    password = Column(String(32), nullable=False)
    email = Column(String(32), nullable=False, unique=True)

    roles = relationship('Role', secondary=useridToRoleid, backref='users')

    def __repr__(self):
        return "<%s users.username: %s>" % (self.id, self.username)

class Role(Base):
    """
    角色表
    """
    __tablename__ = 'roles'
    id = Column(Integer, primary_key=True)
    name = Column(String(16), nullable=False)

    identity = relationship('Identity', secondary=roleidToIdentityid, backref='roles')

    def __repr__(self):
        return "<%s roles.name: %s>" % (self.id, self.name)

class Identity(Base):
    """
    权限表
    """
    __tablename__ = 'identities'
    id = Column(Integer, primary_key=True)
    name = Column(String(16))

    def __repr__(self):
        return "<%s identities.name: %s>" % (self.id, self.name)

class Category(Base):
    __tablename__ = "categories"
    id = Column(Integer, primary_key=True)
    name = Column(String(16), nullable=False)

    title = relationship('Article', backref='category')

    def __repr__(self):
        return "<%s categories.name: %s" % (self.id, self.name)

class Tag(Base):
    __tablename__ = "tags"
    id = Column(Integer, primary_key=True)
    name = Column(String(16))

    def __repr__(self):
        return "<%s categories.name: %s" % (self.id, self.name)

class Article(Base):
    __tablename__ = "articles"
    id = Column(Integer, primary_key=True)
    title = Column(String(50))
    description = Column(String(300))
    content = Column(Text)
    click_count = Column(Integer, default=0)

    category_id = Column(Integer, ForeignKey('categories.id'))
    tags = relationship('Tag', secondary=articleidToTagid, backref='articles')

    def __repr__(self):
        return "<%s categories.name: %s" % (self.id, self.title)
复制代码

修改配置文件

修改alembic.ini配置文件,只修改数据库连接部分即可,

sqlalchemy.url = driver://user:pass@localhost:port/dbname

修改为

sqlalchemy.url = mysql+pymysql://root:@localhost/linux_study

修改alembic/env.py

target_metadata = None

修改为

import sys                                             
from os.path import abspath, dirname                   
sys.path.append(dirname(dirname(abspath(__file__))))   
from modules.models import Base                        
target_metadata = Base.metadata                        

 自动创建版本

使用alembic revision -m "注释" 创建数据库版本,上面我们修改了配置文件alembic/env.py,指定了target_metadata,这里可以使用--autogenerate参数自动生成迁移脚本。

$ alembic revision --autogenerate -m "initdb"

其他常用参数

更新数据库

$ alembic upgrade 版本号

更新到最新版

alembic upgrade head

降级数据库

$ alembic downgrade 版本号

更新到最初版

alembic downgrade head

离线更新(生成sql)

alembic upgrade 版本号 --sql > migration.sql

从特定起始版本生成sql

alembic upgrade 版本一:版本二 --sql > migration.sql

查询当前数据库版本号

查看alembic_version表。

清除所有版本

将versions删掉,并删除alembic_version表

原文链接:http://www.cnblogs.com/xiaoming279/p/6641601.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Alembic是由SQLAlchemy的作者编写的数据库迁移工具。它可以帮助我们在不破坏数据的情况下更新数据库表的结构。使用Alembic可以向数据库发出ALTER语句以更改表的结构和其他结构。使用Alembic进行数据库迁移的过程是通过创建迁移环境、生成迁移文件、同步数据库等步骤来完成的。 具体使用Alembic进行数据库迁移的步骤如下: 1. 安装Alembic使用pip install alembic命令进行安装。 2. 初始化迁移环境:使用alembic init migrations命令初始化迁移环境,创建alembic.ini文件和env.py文件。 3. 修改配置:修改alembic.ini配置文件,将sqlalchemy.url的值配置为数据库连接字符串。 4. 生成迁移文件:使用alembic revision -m "first comment"命令生成迁移文件,可以通过--autogenerate选项参数来自动生成迁移脚本。 5. 同步数据库使用alembic upgrade head命令将数据库表结构更新到最新版本。 除了上述步骤外,还可以使用其他命令进行数据库迁移的管理和操作: - 查看当前数据库版本使用alembic current命令可以查看数据库当前所处的版本。 - 查看迁移历史:使用alembic history命令可以查看项目目录中的迁移脚本信息。 - 更新数据库到指定版本使用alembic upgrade 版本号命令可以将数据库更新到指定的版本。 - 降级数据库使用alembic downgrade 版本号命令可以将数据库降级到指定的版本。 - 离线更新:使用alembic upgrade 版本号 --sql > migration.sql命令可以将数据库更新生成SQL脚本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值