sqlalchemy数据迁移常用的两种方法;
1.alembic
官方文档:https://alembic.sqlalchemy.org/en/latest/tutorial.html
github地址:https://github.com/sqlalchemy/alembic
2.sqlalchemy-migrate (已停止更新,不推荐使用)
models.py代码:
from sqlalchemy import Column, String, DateTime, Boolean, create_engine, Integer, Text, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship
# relationship两个表之间的外键关系
from sqlalchemy.ext.declarative import declarative_base
from alembic import op
# 创建对象的基类:
Base = declarative_base()
# 定义表对象
class GovernmentIndex(Base):
# 定义数据库表名
__tablename__ = 'government_index'
# 表的结构 参数参照上面表单
gid = Column(Integer(), primary_key=True, comment='主键ID')
government_url = Column(String(50), comment="政府网站")
judgment_final = Column(Boolean(), comment='单项否决最终结果判断!')
fraction_result = Column(Integer(), comment='最终分数')
edit_time = Column(DateTime,comment='最后编辑的时间')
def __repr__(self):
return self.government_url
# __repr__() 是一个非常特殊的方法,它是一个“自我描述”的方法,该方法通常用于实现这样一个功能:当程序员直接打印该对象时,系统将会输出该对象的“自我描述”信息,用来告诉外界该对象具有的状态信息。
class JudgmentData(Base):
__tablename__ = 'judgment_data'
jid = Column(Integer(), primary_key=True, comment='主键ID')
matter_name = Column(String(50), comment='事项名称')
matter_status = Column(String(50), comment='事项状态')
judgment_result = Column(Boolean(), comment='判断结果')
error_content = Column(String(255), comment='错误内容')
photo_name = Column(String(50), comment='截图名称')
ago_photo_name = Column(String(50), comment='检测时间点之前的图片名称')
edit_time = Column(DateTime(), comment='最后修改数据的时间')
artificial_results = Column(String(50), comment='人工复核结果')
g_id = Column(Integer, ForeignKey('government_index.gid'))
def __repr__(self):
return self.matter_name
class MinusPoints(Base):
__tablename__ = "minus_points"
mid = Column(Integer(), primary_key=True, comment='主键ID')
matter_name = Column(String(50), comment='事项名称')
matter_status = Column(String(50), comment='事项状态')
fraction_minus = Column(Integer(), comment='扣分分数')
minus_content = Column(String(255), comment='扣分内容')
photo_name = Column(String(50), comment='截图名称')
ago_photo_name = Column(String(50), comment='检测时间点之前的图片名称')
edit_time = Column(DateTime(), comment='最后修改数据的时间')
artificial_results = Column(String(50), comment='人工复核结果')
g_id = Column(Integer, ForeignKey('government_index.gid'))
def __repr__(self):
return self.matter_name
class AddPoints(Base):
__tablename__ = 'add_points'
aid = Column(Integer(), primary_key=True, comment='主键ID')
matter_name = Column(String(50), comment='事项名称')
matter_status = Column(String(50), comment='事项状态')
fraction_add = Column(Integer(), comment='加分分数')
add_content = Column(String(255), comment='加分内容')
photo_name = Column(String(50), comment='截图名称')
ago_photo_name = Column(String(50), comment='检测时间点之前的图片名称')
edit_time = Column(DateTime(), comment='最后修改数据的时间')
artificial_results = Column(String(50), comment='人工复核结果')
g_id = Column(Integer, ForeignKey('government_index.gid'))
def __repr__(self):
return self.matter_name
alembic基本使用
安装:
pip install alembic
cd 到你创建models.py的目录下执行下面命令:
alembic init migrations
migrations 仓库名可以自定义。
修改配置文件
在 alembic.ini 中设置数据库的连接, sqlalchemy.url =driver://user:pass@localhost/dbname ,比如以 mysql 数据库为例,则配置后的代码为:
sqlalchemy.url = mysql+pymysql://root:123456@127.0.0.1:3306/web_inspect
找到env.py:
添加代码:
sys.path.append(os.path.dirname(os.path.abspath(__file__)) +"/../")
from models import Base
如图:
找到:target_metadata = None 替换成 target_metadata = Base.metadata;
如图:
如果models有红色波浪线 飘红 找到项目文件夹点击右键,操作如图:
生成迁移文件
alembic revision --autogenerate -m "v1" 将当前模型中的状态生成迁移文件
命令和参数解释:
init:创建一个 alembic 仓库。
revision:创建一个新的版本文件。
--autogenerate:自动将当前模型的修改,生成迁移脚本。
-m:本次迁移做了哪些修改,用户可以指定这个参数,方便回顾。
upgrade:将指定版本的迁移文件映射到数据库中,会执行版本文件中的 upgrade 函数。如果有多个迁移脚本没有被映射到数据库中,那么会执行多个迁移脚本。
[head]:代表最新的迁移脚本的版本号。
downgrade:会执行指定版本的迁移文件中的 downgrade 函数。
heads:展示head指向的脚本文件版本号。
history:列出所有的迁移版本及其信息。
current:展示当前数据库中的版本号。另外,在你第一次执行 upgrade 的时候,就会在数据库中创建一个名叫 alembic_version 表,这个表只会有一条数据,记录当前数据库映射的是哪个版本的迁移文件。
更新到数据库
命令:
alembic upgrade head
如果要降级,那么使用
alembic downgrade head
具体其他操作,参考官方文档:
官方文档:https://alembic.sqlalchemy.org/en/latest/tutorial.html