博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python的数据库操作(Sqlalchemy)
阅读量:4637 次
发布时间:2019-06-09

本文共 5003 字,大约阅读时间需要 16 分钟。

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值

转载于:https://www.cnblogs.com/dongxiaodong/p/10495642.html

你可能感兴趣的文章
USACO 1.5.4 Checker Challenge
查看>>
第二阶段站立会议7
查看>>
[18]Debian Linux Install GNU GCC Compiler and Development Environment
查看>>
JAVA多线程
查看>>
ACE(Adaptive Communication Environment)介绍
查看>>
delphi 更改DBGrid 颜色技巧
查看>>
python编码问题
查看>>
POJ 2031 Building a Space Station
查看>>
面向对象1
查看>>
编程开发之--java多线程学习总结(5)
查看>>
register_globals(全局变量注册开关)
查看>>
as3调用外部swf里的类的方法
查看>>
如何让 zend studio 10 识别 Phalcon语法并且进行语法提示
查看>>
任意阶幻方(魔方矩阵)C语言实现
查看>>
视频教程--ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
查看>>
第五次作业
查看>>
织梦教程
查看>>
杭电多校 Harvest of Apples 莫队
查看>>
java 第11次作业:你能看懂就说明你理解了——this关键字
查看>>
C/C++心得-结构体
查看>>