python ORM中sqlalchemy的使用

原理和基础使用方法请参考官方文档

实战中的使用

使用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 语句。

常用方法

  1.  添加列(Add Column)

    op.add_column('table_name', sa.Column('column_name', sa.String(50), nullable=True))
    
  2. 删除列(Drop Column)

    op.drop_column('table_name', 'column_name')
    
  3. 添加索引(Add Index)

    op.create_index('index_name', 'table_name', ['column_name'])
    
  4. 删除索引(Drop Index)

    op.drop_index('index_name', 'table_name')
    
  5. 添加外键约束(Add Foreign Key)

    op.create_foreign_key('fk_name', 'table_name', 'other_table', ['foreign_key_column'], ['primary_key_column'])
    
  6. 删除外键约束(Drop Foreign Key)

    op.drop_constraint('fk_name', 'table_name', type_='foreignkey')
    
  7. 添加唯一约束(Add Unique Constraint)

    op.create_unique_constraint('uc_name', 'table_name', ['column_name'])
    
  8. 删除唯一约束(Drop Unique Constraint)

    op.drop_constraint('uc_name', 'table_name', type_='unique')
    
  9. 修改列类型(Modify Column)

    op.alter_column('table_name', 'column_name', type_=sa.String(50))
    
  10. 添加默认值(Add Default)

    op.execute('ALTER TABLE table_name ALTER COLUMN column_name SET DEFAULT value')
    
  11. 删除默认值(Drop Default)

    op.execute('ALTER TABLE table_name ALTER COLUMN column_name DROP DEFAULT')
    
  12. 添加表(Create Table)

    op.create_table('new_table', ...)
    
  13. 删除表(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 表里对应的版本

未完待续~~~

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值