ORM——Object-Relational Mapping,即将实体对象与数据库表进行映射,屏蔽了底层的sql语句就可以操作类对象;SQLAlchemy是常用的ORM框架,相比于Django的ORM框架,SQLAlchemy更适用与独立的python项目,因此更加通用,通常会配合alembic进行数据库的版本管理,使得数据库更新迁移更加方便,本篇将带领大家走近SQLAlchemy,了解其基本使用方法。
安装alembic
pip install alembic
初始化alembic环境
在项目路径下运行下面的命令
alembic init alembic
完成之后会生成以下文件结构,有alembic文件夹和alembic.ini文件
修改配置
1、修改alembic.ini配置文件
sqlalchemy.url = mysql+pymysql://root:12345678@localhost:3306/MyDatabase
2、修改alembic/env.py
import sysfrom os.path import abspath, dirnamesys.path.append(dirname(dirname(abspath(__file__))))from Modules import Modelstarget_metadata = Models.Base.metadata
创建模型类
新建Models.py文件,并定义表模型类
from sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, String, Integer,ForeignKeyfrom sqlalchemy.orm import sessionmaker, relationshipfrom sqlalchemy import create_engine, Table# 创建基类,自定义类继承基类Base = declarative_base()# Author与Article是1对多的关系class Author(Base): __tablename__="author" id = Column(Integer,primary_key=True) name = Column(String(30),nullable=False) article = relationship("Article", back_populates="author") # back_populates要和Aiticle中什么的关系字段author一样 def __repr__(self): return 'author id={}, author name={}'.format(self.id, self.name)class Article(Base): __tablename__="article" id = Column(Integer,primary_key=True) name = Column(String(100),nullable=False) author_id = Column(Integer,ForeignKey("author.id")) # 这里的ForeignKey一定要是表名.id不是对象名 author = relationship("Author",back_populates="article") def __repr__(self): return 'articel id={}, article name={}'.format(self.id, self.name)
新建setting文件,自定义一些全局配置
from configparser import ConfigParserconf=ConfigParser()conf.read('alembic.ini')MYSQL_URL=conf.get('alembic','sqlalchemy.url')
创建表
# 生成迁移脚本,自动保存到alembic/versions下alembic revision --autogenerate -m "initdb"# 提交更新至数据库(head表示最新的版本)alembic upgrade head# 如果需要降级数据库版本,执行# alembic downgrade 版本号# 离线更新,先生成sql文件# alembic upgrade 版本号 --sql > migration.sql
执行以上命令后,数据库生成类对象映射的表
给Author表添加数据
from Modules.Models import Article, Authorfrom sqlalchemy.orm import sessionmaker, relationshipfrom sqlalchemy import create_enginefrom settings import MYSQL_URLengine=create_engine(MYSQL_URL)Session = sessionmaker(bind=engine)db_session = Session()# 两种方式添加数据author=Author(id=1,name="作者1")db_session.add(author)db_session.add_all([ Author(id=2,name='作者2'), Author(id=3,name='作者3'),])# 提交数据到数据库db_session.commit()# 关闭会话db_session.close()
查看数据库
给关联的Article添加数据
# 给Article表添加数据, 并关联现有的Author记录article_1=Article(id=1,name="Python基础编程",author=db_session.query(Author).filter(Author.name=='作者1').first())# 给rticle添加数据的同时给Author添加数据article_2=Article(id=2,name='Python高级编程',author=Author(name='作者4'))db_session.add_all([article_1,article_2])# 提交数据到数据库db_session.commit()# 关闭会话db_session.close()
执行后,表Author和Article的记录分别如下
通过表Author给关联的表Article添加数据
author_1=Author(id=7,name="作者7")author_1.article=[Article(id=3,name="软件测试入门"),Article(id=4,name="软件测试进阶")]author_2=Author(id=8, name="作者8", article=[Article(id=5,name="Docker入门")])db_session.add_all([author_1,author_2])# 提交数据到数据库db_session.commit()# 关闭会话db_session.close()
执行后,表Author和Article的记录分别如下
查询数据
通过author查article
author_list=db_session.query(Author).all()for each_author in author_list: print(each_author.name, each_author.article) -------------------------------------- 作者1 [articel id=1, article name=Python基础编程]作者2 []作者3 []作者4 [articel id=2, article name=Python高级编程]作者7 [articel id=3, article name=软件测试入门, articel id=4, article name=软件测试进阶]作者8 [articel id=5, article name=Docker入门]
通过article查author
article_list = db_session.query(Article).all()for each_article in article_list: print(each_article.name, each_article.author) ---------------------------------------Python基础编程 author id=1, author name=作者1Python高级编程 author id=6, author name=作者4软件测试入门 author id=7, author name=作者7软件测试进阶 author id=7, author name=作者7Docker入门 author id=8, author name=作者8
修改数据
# 修改article为"Python高级编程"的作者姓名为"作者6"article=db_session.query(Article).filter(Article.name=="Python高级编程").all()for at in article: db_session.query(Author).filter(Author.id==at.author_id).update({"name":"作者6"})# 提交数据到数据库db_session.commit()# 关闭会话db_session.close()
更新记录
删除数据
# 删除作者8的相关数据author=db_session.query(Author).filter(Author.name=="作者8").first()db_session.query(Article).filter(Article.author_id==author.id).delete()db_session.delete(author)# 提交数据到数据库db_session.commit()# 关闭会话db_session.close()
数据库记录中成功删除了”作者8“的数据