ORM 全称 Object Relational Mapping, 翻译过来叫对象关系映射。简单的说,ORM 将数据库中的表与面向对象语言中的类建立了一种对应关系。这样,我们要操作数据库,数据库中的表或者表中的一条记录就可以直接通过操作类或者类实例来完成。
SQLAlchemy 是Python 社区最知名的 ORM 工具之一,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型。支持多数据库,如mysql、Oracle等
安装:
pip3 install sqlalchemy
使用步骤:
l 建立数据库连接
l 描述表结构(如果表不存在则会新建表)
l 得到数据库操作游标(会话session)
l 操作数据表,提供了两种方法,分别为原生SQL语句操作(execute)和类方式操作
通过原生SQL语句操作
1 #导入必要模块 2 from sqlalchemy import create_engine 3 4 #得到连接对象 5 #参数:mysql+pymysql://用户名:密码@地址/数据库名 6 #添加参数 echo=True 表示打印日志到控制台 7 connal = create_engine("mysql+pymysql://root2:proot2@192.168.1.175/dongdb",encoding='utf-8') 8 9 #查询10 resselect=connal.execute("select * from tb_dong")11 print(resselect.rowcount) #输出查询到的值12 print(resselect.fetchall()) #输出列表数据13 14 #插入,输出影响行数15 resinsert=connal.execute("insert into tb_dong(namex,sex) values('%s','%s')"%("东小东xx","F")).rowcount16 print(resinsert)
类方式操作
描述表结构时:
设置为主键【primary_key=True】、
是否可为空【nullable=False】、
外键【ForeignKey(“另一个表名.字段名”)】 #表名与字段名的点不可去掉
1 #导入必要模块 2 import sqlalchemy 3 from sqlalchemy import create_engine 4 from sqlalchemy.ext.declarative import declarative_base 5 from sqlalchemy import Column, Integer, String 6 from sqlalchemy.orm import sessionmaker 7 8 9 #-------------得到连接对象--------------------10 #参数:mysql+pymysql://用户名:密码@地址/数据库名11 #添加参数 echo=True 表示打印日志到控制台12 connal = create_engine("mysql+pymysql://root2:proot2@192.168.1.175/dongdb",13 encoding='utf-8')14 15 #----------------创建表,描述表结构-----------------------16 #得到基类17 classal = declarative_base()18 class tb_dong3(classal):19 __tablename__ = "tb_dong3" # 表名为 tb_dong320 id = Column(Integer, primary_key=True) # 设置列为主键,默认不可为空且自增21 name = Column(String(15))22 password = Column(String(15))23 24 def __repr__(self):25 return ""%(self.id,self.name,self.password)26 27 #提交创建表命令28 classal.metadata.create_all(connal)29 30 #------------------ 游标获取 ------------------31 32 #得到数据库游标33 cousession=sessionmaker(bind=connal)()34 35 #--------------------插入数据------------------36 #设置要插入的数据37 dataobj1=tb_dong3(name="dong",password="dongpp东1")38 dataobj2=tb_dong3(name="dong",password="dongpp东2")39 40 #添加数据,参数可为列表:add([dataobj1, dataobj1])41 cousession.add(dataobj1)42 cousession.add(dataobj2)43 44 #提交数据45 cousession.commit()46 47 #--------------------查询数据---------------------48 #filter(tb_dong3.id>1)为条件查询49 #多条件查询可以使用多个 filter 拼接50 #查询所有:all() 查询一个:first() 计数:count()51 resdata=cousession.query(tb_dong3).filter(tb_dong3.id>0).filter(tb_dong3.name=="dong").all() #查询所有52 print(resdata) #输出全部查询结果53 #print(cousession.query(tb_dong3).filter(tb_dong3.id>0).filter(tb_dong3.name=="dong").count()) #查询所有54 print(len(resdata)) #得到查询结果的数量,相当于上面一句55 print(resdata[0].name) #取出name值56 57 #----------------- 更新--------------------------58 #先查询,然后赋值,然后提交59 resupdate=cousession.query(tb_dong3).filter(tb_dong3.id==3).first()60 resupdate.name="ddddddddd"61 resupdate.password="xxxxxx"62 cousession.commit()63 64 #------------------- 删除 -----------------------65 resdel=cousession.query(tb_dong3).filter(tb_dong3.id==73).first()66 cousession.delete(resdel)67 cousession.commit()
连表操作:
重点在于需要描述两张表
1 #导入必要模块 2 from sqlalchemy import create_engine 3 from sqlalchemy.ext.declarative import declarative_base 4 from sqlalchemy import Column, Integer, String 5 from sqlalchemy.orm import sessionmaker 6 7 8 #-------------得到连接对象-------------------- 9 #参数:mysql+pymysql://用户名:密码@地址/数据库名10 #添加参数 echo=True 表示打印日志到控制台11 connal = create_engine("mysql+pymysql://root2:proot2@192.168.1.175/dongdb",12 encoding='utf-8')13 14 #----------------创建表,描述表结构-----------------------15 #得到基类16 classal = declarative_base()17 #建立tb_dong3表描述18 class tb_dong3(classal):19 __tablename__ = "tb_dong3" # 表名为 tb_dong320 id = Column(Integer, primary_key=True) # 设置列为主键,默认不可为空且自增21 name = Column(String(15))22 password = Column(String(15))23 24 def __repr__(self):25 return ""%(self.id,self.name,self.password)26 27 #建立tb_dong2表描述28 class tb_dong2(classal):29 __tablename__ = "tb_dong2" # 表名为 tb_dong330 id = Column(Integer, primary_key=True) # 设置列为主键,默认不可为空且自增31 name = Column(String(10))32 sex = Column(String(1))33 34 def __repr__(self):35 return " "%(self.id,self.name,self.sex)36 37 #提交创建表命令38 classal.metadata.create_all(connal)39 40 #------------------ 游标获取 ------------------41 42 #得到数据库游标43 cousession=sessionmaker(bind=connal)()44 45 #-------------------- 连表查询 ---------------------46 #tb_dong3.name==tb_dong2.name 两表的name字段值相等47 #得到单表数据(tb_dong2)48 #resdata=cousession.query(tb_dong2).filter(tb_dong3.id>0).filter(tb_dong3.name==tb_dong2.name).all()49 #输出两张表的数据(tb_dong2,tb_dong3)50 resdata=cousession.query(tb_dong2,tb_dong3).filter(tb_dong3.id>0).filter(tb_dong3.name==tb_dong2.name).all()51 print(resdata) #输出全部查询结果52 print(len(resdata)) #得到查询结果的数量,相当于上面一句53 print(resdata[0][0].name) #取出name值