原理和基础使用方法请参考官方文档
实战中的使用
使用sqlalchemy2.0以上的版本
创建表
需求:目前我需要创建一个mysql表,里面需要有主键id、项目名、项目路径
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.orm import declarative_base
from sqlalchemy.orm import sessionmaker
# 定义数据库URL
DATABASE_URL = "mysql+pymysql://root:123456@localhost/testtools"
# 创建数据库引擎
engine = create_engine(DATABASE_URL)
# 创建ORM模型的基类
Base = declarative_base()
# 定义模型
class Jconfig(Base):
__tablename__ = "config"
id = Column(Integer, primary_key=True, index=True)
project_name = Column(String(24), index=True, comment='项目名')
path = Column(String(255), index=True, comment='项目路径')
run_path = Column(String(256), index=True, comment='运行路径')
# 创建所有表
Base.metadata.create_all(bind=engine)
表创建好了之后,发现漏了一个字段。这时候就要用到数据迁移了,使用Alembic来管理数据库迁移。
首先在Jconfig 类中加入
git_url = Column(String(512), index=True, comment='git地址')
命令行安装:
# 安装Alembic工具
pip install alembic
# 项目中,初始化Alembic迁移环境
alembic init migrations
Alembic 初始化完成后,项目根目录下配置文件:
配置 alembic.ini
sqlalchemy.url = mysql+pymysql://root:123456@localhost/testtools
接着修改migrations文件中env.py配置
from 你的项目 import Base
# target_metadata = none 替换为你SQLAlchemy声明的基类
target_metadata = Base.metadata
命令行执行记录版本变更; -m 命名
alembic revision --autogenerate -m "XXXXX"
此时生成了版本文件
进入文件中需要我们手动管理迁移:
upgrade()
函数通常包含用于添加新列、修改现有列、创建新表、修改表结构等操作的 SQL 语句。
downgrade()
函数通常包含用于撤销/回滚upgrade()
函数中执行的操作的 SQL 语句。
常用方法
-
添加列(Add Column)
op.add_column('table_name', sa.Column('column_name', sa.String(50), nullable=True))
-
删除列(Drop Column)
op.drop_column('table_name', 'column_name')
-
添加索引(Add Index)
op.create_index('index_name', 'table_name', ['column_name'])
-
删除索引(Drop Index)
op.drop_index('index_name', 'table_name')
-
添加外键约束(Add Foreign Key)
op.create_foreign_key('fk_name', 'table_name', 'other_table', ['foreign_key_column'], ['primary_key_column'])
-
删除外键约束(Drop Foreign Key)
op.drop_constraint('fk_name', 'table_name', type_='foreignkey')
-
添加唯一约束(Add Unique Constraint)
op.create_unique_constraint('uc_name', 'table_name', ['column_name'])
-
删除唯一约束(Drop Unique Constraint)
op.drop_constraint('uc_name', 'table_name', type_='unique')
-
修改列类型(Modify Column)
op.alter_column('table_name', 'column_name', type_=sa.String(50))
-
添加默认值(Add Default)
op.execute('ALTER TABLE table_name ALTER COLUMN column_name SET DEFAULT value')
-
删除默认值(Drop Default)
op.execute('ALTER TABLE table_name ALTER COLUMN column_name DROP DEFAULT')
-
添加表(Create Table)
op.create_table('new_table', ...)
-
删除表(Drop Table)
op.drop_table('table_name')
最后,命令行进行数据迁移:
alembic upgrade head
迁移成功
查询数据
写一个方法查询出表里所有行的数据
from sqlalchemy import desc
from sqlalchemy.orm import sessionmaker
from DAO.ORM import engine, Jconfig
def with_session(func):
"""
处理session生命周期
:param func: 需要使用session的方法
:return: 完成生命周期的session
"""
def wrapper(*args, **kwargs):
# 创建一个新的会话
session = Session()
try:
# 调用函数,并传递会话对象
result = func(session, *args, **kwargs)
# 直接返回结果,不需要额外的处理
return result
except Exception as e:
# 如果发生错误,回滚会话
session.rollback()
raise e
finally:
# 关闭会话
session.close()
return wrapper
@with_session
def select_jconfig_data(session, pageIndex=None, pageSize=None):
# 定义一个查询对象
query = session.query(Jconfig).order_by(desc(Jconfig.id))
# 如果提供了页数和条数,则进行分页
if pageIndex and pageSize:
start = (pageIndex - 1) * pageSize
end = pageIndex * pageSize
query = query.limit(pageSize).offset(start)
data = [[row.id, row.project_name, ] for row in query]
# 执行查询并返回结果
return data
if __name__ == '__main__':
print(select_jconfig_data())
使用注意
orm通过类似git的版本管理方式记录项目中类对象和数据库表的版本更迭关系
建议单独创建一个数据库,统一使用该orm管理
自动生成版本文件时最好进入文件查看修改了那些表,有不满意的可以自行修改代码
删除 migrations\versions 下的版本文件后,需要删除数据库 alembic_version 表里对应的版本
未完待续~~~