alembic migration 自动生成migration脚本
使用alembic做数据migration的时候, 创建数据表的过程往往是一种体力活, 脚本中需要这样的代码以完成数据表的创建:
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('table1',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('field1', sa.String(length=60), nullable=False),
sa.Column('field2', sa.String(length=60), nullable=False),
sa.Column('field3', sa.String(length=255), nullable=False),
sa.Column('field4', sa.String(length=255), nullable=False),
sa.Column('field5', sa.String(length=255), nullable=False),
sa.Column('field6', sa.String(length=255), nullable=False),
sa.Column('field7', sa.String(length=255), nullable=False),
sa.Column('field8', sa.String(length=255), nullable=False),
sa.Column('field9', sa.String(length=255), nullable=False),
sa.Column('field10', sa.String(length=255), nullable=True),
sa.Column('field11', sa.String(length=255), nullable=True),
sa.Column('field12', sa.String(length=255), nullable=True),
sa.Column('field13', sa.String(length=255), nullable=True),
sa.Column('field14', sa.String(length=255), nullable=True),
sa.Column('field15', sa.Text(), nullable=True),
sa.Column('field16', sa.DateTime(), nullable=True),
sa.Column('field17', sa.DateTime(), nullable=True),
sa.Column('field18', sa.Numeric(precision=20, scale=5), nullable=True),
sa.PrimaryKeyConstraint('id')
)
op.create_index('field7_field8', 'table1', ['field7', 'field8'], unique=False)
op.create_index(op.f('ix_table1_field3'), 'table1', ['field3'], unique=False)
op.create_index(op.f('ix_table1_field11'), 'table1', ['field11'], unique=False)
op.create_index(op.f('ix_table1_field10'), 'table1', ['field10'], unique=False)
op.create_index(op.f('ix_table1_field8'), 'table1', ['field8'], unique=False)
无疑者如果是手动填写将会是非常的繁琐, 程序员是无法忍受这样的事情的.
首先alembic本身使用了sqlalchemy, 意味着实际上它能够根据sqlalchemy的model自动生成以上的migration脚本.
目录结构:
├── alembic
│ ├── env.py
│ ├── init.py
│ ├── README
│ ├── script.py.mako
│ └── versions
│ ├── 1_0_0_170310_init_db.py
│ └── init.py
├── alembic.ini
├── model.py
└── init.py
用 sqlacodegen 将存在的数据库表 转化成model.py
首先需要安装sqlacodegen:pip install sqlacodegen然后生成model:sqlacodegen --outfile d:\\models.py mysql://test:test@localhost:3306/test将model.py放到根目录下, 修改env.py, 再引入处添加以下几行:
import os import sys sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../") from models import Base然后把
target_metadata = None修改为:target_metadata = Base.metadata最后执行命令:
alembic revision --autogenerate --rev-id REV_ID 20170313_001 -m "create tables"到此, 数据库表结构的migration脚本已经生成成功!
数据初始化
数据初始化有两种方式, 第一种比较简单粗暴, 就是写个sql文件, 让migration脚本去执行, 我在创建存储过程的时候选择了这种方法, 因为按照alembic的cook book里创建存储过程的方法是非常麻烦的, 不知道为何这个方法没有集成进去.
第二种方法是使用SQLAlchemy的ORM, 因为已经有了表所对应的model , 因此首先创建一个model对象, 并放到conn中去执行, 如下代码, 放到upgrade方法中:
conn = op.get_bind()
table1 = Table1(field1='1',
field2='1',
field3='1',
field4='1',
field5='1',
field6='1',
field7='1')
table2 = Table1(field1='2',
field2='2',
field3='2',
field4='2',
field5='2',
field6='2',
field7='2')
conn.execute(
Table1.__table__.insert(),
[table1.to_dict(), table2.to_dict()]
)
这样就能将数据初始化到库中了.
顺便说明下, 自动生成的model中的对象是没有to_dict方法的,需要自己添加:
class S01ChangeOrder(Base):
__tablename__ = 's01_change_order'
__table_args__ = (
Index('data_source_external_key', 'data_source', 'external_key'),
)
id = Column(Integer, primary_key=True)
field1 = Column(String(60), nullable=False)
field2 = Column(String(60), nullable=False)
field3 = Column(String(255), nullable=False, index=True)
field4 = Column(String(255), nullable=False, index=True)
field5 = Column(String(255), nullable=False)
field6 = Column(String(255), nullable=False, index=True)
field7 = Column(String(255), nullable=False)
field8= Column(String(255), nullable=False, index=True)
field9= Column(String(255), nullable=False)
field10= Column(String(255))
field11= Column(String(255))
field12 = Column(String(255))
field13= Column(String(255))
field14= Column(String(255))
field15= Column(Text)
field16= Column(DateTime)
field17 = Column(DateTime)
field18= Column(Numeric(20, 5))
def to_dict(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
本文介绍了如何使用Alembic自动化生成数据库迁移脚本,避免手动编写繁琐的创建表代码。通过sqlacodegen将现有数据库转换为model.py,并在alembic的env.py中进行配置,执行命令生成迁移脚本。数据初始化方面,提供了两种方法,包括直接执行SQL文件和使用SQLAlchemy ORM进行数据填充。
409

被折叠的 条评论
为什么被折叠?



