本文介绍结合 python 的几个工具,实现轻量级的数据库迁移。
在日常工作中,可能需要将数据迁移到不同的数据库,可以考虑下面一些简单的办法:
- kettle 的多表复制向导,之前写过一篇博文:Kettle (6) - 跨数据库数据迁移几个细节
- 使用 CSV 作为中介,需要花时间处理字段的数据类型
- 利用 sqlalchemy,之前写过一篇博文:pandas DataFrame.to_sql() 用法。博文的操作过程还是比较繁琐,需要手工维护字段的数据类型
假设我们现在需要把 sql server 中 emp_master 表的数据迁移到 sqlite 数据库的同名表中。迁移的过程分为两步:
- 基于源数据库的表结构,在目标数据库中创建表
- 利用 pandas 的 dataframe 将数据传输到目标数据库
创建数据库表schema
首先利用 sqlacodegen 工具,生成 sqlalchemy ORM 模型:
sqlacodegen mssql+pymssql://user:pwd@localhost:1433/testdb > models.py -- tables emp_master
生成如下的代码,起始代码可能有些差异,手工修改一下:
# models.py
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class EmpMaster(Base):
__tablename__ = 'emp_master'
EMP_ID = Column(Integer, primary_key=True)
GENDER = Column(String(10))
AGE = Column(Integer)
EMAIL = Column(String(50))
PHONE_NR = Column(String(20))
EDUCATION = Column(String(20))
MARITAL_STAT = Column(String(20))
NR_OF_CHILDREN = Column(Integer)
使用 sqlalchemy 在目标数据库中创建数据库和表:
# create_shcema.py
from sqlalchemy import create_engine
from models import Base
engine = create_engine('sqlite:///employees.db')
Base.metadata.create_all(engine)
利用 pandas dataframe 迁移数据
需要用到 read_sql() 方法读取数据到 dataframe,用到 dataframe 的 to_sql() 方法将数据发送的目标数据库:
# data_migrate.py
from sqlalchemy import create_engine
import pandas as pd
source_engine = create_engine('mssql+pymssql://user:pwd@localhost:1433/testdb')
target_engine = create_engine('sqlite:///employees.db')
df = pd.read_sql('emp_master', source_engine)
df.to_sql('emp_master', target_engine, index=False, if_exists='replace')