十六、python操作SQLAlchemy(一)
发布日期:2021-10-31 07:31:26
浏览次数:21
分类:技术文章
本文共 7230 字,大约阅读时间需要 24 分钟。
SQLAlchemy
SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API智商,使用关系对象映射进行数据库操作,换句话说就是:将对象转换成SQL,然后使用数据API执行SQL语句并获取到执行结果。
pymysql操作数据库
以前我们常用pymysql来操作数据库,举个栗子(需要提前安装上pymysql)
#!/usr/bin/env python# -*- coding:utf-8 -*-# Author: Leon xieimport pymysql#创建连接conn = pymysql.connect(host='192.168.56.11',port=3306,user='root',passwd='root',db='oldboydb')#创建游标 socket上建立的实例cursor=conn.cursor()#执行SQL,并返回行数,用游标执行,effect_row = cursor.execute("select * from student")# print(cursor.fetchone())# print(cursor.fetchone())print(cursor.fetchall())
这样就可以把数据全部取出来。
插入数据
#!/usr/bin/env python# -*- coding:utf-8 -*-# Author: Leon xieimport pymysql#创建连接conn = pymysql.connect(host='192.168.56.11',port=3306,user='root',passwd='root',db='oldboydb')#创建游标 socket上建立的实例cursor=conn.cursor()#执行SQL,并返回行数,用游标执行,#effect_row = cursor.execute("select * from student")# print(cursor.fetchone())# print(cursor.fetchone())# print(cursor.fetchall())data = [ ("N1","2015-05-22",'M'), ("N2","2015-05-22",'M'), ("N3","2015-05-22",'M'), ("N4","2015-05-22",'M'),]cursor.executemany("insert into student (name,register_date,gender) values(%s,%s,%s)",data )conn.commit()
有个问题,上面需要我写原生的SQL语句来使用。如果写原生,自己增删改,如果简单还行,复杂就很麻烦了,重用性不强,因为都是写死在里面,如果数据库结果变化就的改,对扩展什么都不方便,包括
SQL水平也就一般般,很多情况写不出高效的SQL语句,涉及到软件好慢好慢,加机器都不好使。
为了避免,我们把原生SQL写死到源代码里,怎么办呢?就要引入下面的东西。ORM
SQLAlchemy是python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作。简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
这样,就不用写原生的SQL了。 所以我们引入了ORM,什么是ORM?ORM就是对象映射关系程序。相当于ORM帮我们把对象里的转化成SQL然后跟数据库交互
ORM的优点
隐藏了数据访问细节,封闭的通用数据库交互,ORM的核心,它使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。
ORM使我们构造固化数据结构变得简单易行。
ORM的缺点
- 无可避免,自动化意味着映射和关联管理,代价是牺牲性能
ORM是一个术语,不是一个软件,基于ORM的标准下,有很多软件,最执行的就是SQLAlchemy ,(SQL 阿哥迷)
如何使用?
windows下安装
pip install sqlalchemy
ORM实现一个创建表的功能
#!/usr/bin/env python# -*- coding:utf-8 -*-# Author: Leon xieimport sqlalchemyfrom sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column,Integer,Stringengine = create_engine("mysql+pymysql://root:root@192.168.56.11/oldboydb",encoding='utf-8',echo=True)#echo=True,就是把整个过程打印出来Base=declarative_base() #生成ORM基类class User(Base): __tablename__ = 'user' #表名 id = Column(Integer,primary_key=True) #字段,整形,主键 column是导入的 name = Column(String(32)) password = Column(String(64))Base.metadata.create_all(engine) #创建表结构
实现结果,就是在数据库创建了一个表,user,再次执行,如果数据库有,它就不会创建了。
插入数据
'''创建数据,有个游标的东西叫做sessionmaker需要单独导入'''#实例与socket绑定,创建与数据库的绘画session class,注意,这里返回#给session的是一个class,不是实例Session_class = sessionmaker(bind=engine)#生成session实例,cursorSession = Session_class()#生产你要创建的数据对象xiedi_obj = User(name="alex",password="123")xiedi_obj2 = User(name="jack",password="123")#目前还没有创建对象,可以打印看看,上面只是申明print(xiedi_obj.name,xiedi_obj.id)#把要创建的数据对象添加到这个session里,一会同一创建Session.add(xiedi_obj)Session.add(xiedi_obj2)#这里依旧没有创建print(xiedi_obj.name,xiedi_obj.id)#现在才同一提交,创建数据Session.commit()
查询
#!/usr/bin/env python# -*- coding:utf-8 -*-# Author: Leon xie'''利用ORM实现一个创建表的功能'''import sqlalchemyfrom sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column,Integer,Stringfrom sqlalchemy.orm import sessionmaker#创建连接engine = create_engine("mysql+pymysql://root:root@192.168.56.11/oldboydb",encoding='utf-8')Base = declarative_base() #生成ORM基类#创建表结构class User(Base): __tablename__ = 'xiedi' #表名 id = Column(Integer,primary_key=True) name = Column(String(32)) password = Column(String(64)) def __repr__(self): return "<%s name:%s>" % (self.id,self.name)#直接调用基类下的方法,创建表结构Base.metadata.create_all(engine)'''查看'''T1 = sessionmaker(bind=engine)T2 = T1()#filter查出来的是一组数据,它不知道你要查多少data = T2.query(User).filter_by().all()print(data)复制代码打印结果[<1 name:alex>, <2 name:jack>]修改,原理就是搜索出来,然后赋值复制代码data = Session.query(User).filter(User.id>1).filter(User.id<4).first()print(data)data.name = "Jack Liu"data.password = "Shit happens"#提交Session.commit()
统计
#!/usr/bin/env python# -*- coding:utf-8 -*-# Author: Leon xie'''利用ORM实现一个创建表的功能'''import sqlalchemyfrom sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column,Integer,Stringfrom sqlalchemy.orm import sessionmaker#创建连接engine = create_engine("mysql+pymysql://root:root@192.168.56.11/oldboydb",encoding='utf-8')Base = declarative_base() #生成ORM基类#创建表结构class User(Base): __tablename__ = 'xiedi' #表名 id = Column(Integer,primary_key=True) name = Column(String(32)) password = Column(String(64))#直接调用基类下的方法Base.metadata.create_all(engine)#实例与socket绑定,创建与数据库的绘画session class,注意,这里返回#给session的是一个class,不是实例Session_class = sessionmaker(bind=engine)#生成session实例,cursorSession = Session_class()#创建用户fake_user = User(name='rain',password="12345")Session.add(fake_user)print(Session.query(User).filter(User.name.in_(['xiedi','rain','jack'])).all())Session.rollback()print(Session.query(User).filter(User.name.in_(['xiedi','rain','jack'])).all())print(Session.query(User).filter(User.name.in_(['Jack','rain'])).count())打印结果1复制代码那么如何取分组呢?统计每个名字出现多少次复制代码#!/usr/bin/env python# -*- coding:utf-8 -*-# Author: Leon xie'''利用ORM实现一个创建表的功能'''import sqlalchemyfrom sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column,Integer,Stringfrom sqlalchemy.orm import sessionmaker#创建连接engine = create_engine("mysql+pymysql://root:root@192.168.56.11/oldboydb",encoding='utf-8')Base = declarative_base() #生成ORM基类#创建表结构class User(Base): __tablename__ = 'xiedi' #表名 id = Column(Integer,primary_key=True) name = Column(String(32)) password = Column(String(64))#直接调用基类下的方法,创建表结构Base.metadata.create_all(engine)'''创建数据,有个游标的东西叫做sessionmaker需要单独导入'''#实例与socket绑定,创建与数据库的绘画session class,注意,这里返回#给session的是一个class,不是实例Session_class = sessionmaker(bind=engine)#生成session实例,cursorSession = Session_class()from sqlalchemy import funcprint(Session.query(User.name,func.count(User.name)).group_by(User.name).all())打印结果[('alex', 1, 'alex'), ('Jack Liu', 1, 'Jack Liu')]
外键关联
#!/usr/bin/env python# -*- coding:utf-8 -*-# Author: Leon xieimport sqlalchemyfrom sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column,Integer,String,DATE,Enumfrom sqlalchemy.orm import sessionmakerengine = create_engine("mysql+pymysql://root:root@192.168.56.11/oldboydb",encoding='utf-8')#echo=True,就是把整个过程打印出来Base=declarative_base() #生成ORM基类class User(Base): __tablename__ = 'user' #表名 id = Column(Integer,primary_key=True) #字段,整形,主键 column是导入的 name = Column(String(32)) password = Column(String(64)) def __repr__(self): return "<%s name:%s>" % (self.id,self.name)class Student(Base): __tablename__ = 'student' #表名 id = Column(Integer,primary_key=True) #字段,整形,主键 column是导入的 name = Column(String(32),nullable=False) register_date = Column(DATE,nullable=False) gender = Column(String(32),nullable=False) def __repr__(self): return "<%s name:%s>" % (self.id,self.name)Base.metadata.create_all(engine) #创建表结构Session_class = sessionmaker(bind=engine)Session = Session_class()# s1 = Student(name="s2",register_date="2015-03-01",gender="F")# Session.add(s1)print(Session.query(User,Student).filter(User.id==Student.id).all())Session.commit()
原文地址:
转载地址:https://blog.csdn.net/weixin_39934221/article/details/80319832 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月09日 06时51分30秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
vue的一些基础知识点
2019-04-26
webpack错误记录(不定期更新)
2019-04-26
Poj百练 2692:假币问题 (分类:模拟)
2019-04-26
前后分但文件上传与多文件上传,前端实现
2019-04-26
SpringBoot自定义banner
2019-04-26
Poj百练 2746:约瑟夫问题 (分类:模拟)
2019-04-26
git知识点梳理
2019-04-26
git中tag标签的用法
2019-04-26
boost::bad_function_call用法的测试程序
2019-04-26
微信公众号介绍_以及注册订阅号---微信公众号开发工作笔记0001
2019-04-26
Vue模板语法---vue工作笔记0003
2019-04-26
Vue计算属性之基本使用---vue工作笔记0004
2019-04-26
Vue监视---vue工作笔记0005
2019-04-26
Vue条件渲染---vue工作笔记0008
2019-04-26
Vue事件处理_vue的事件处理超级方便_功能强大---vue工作笔记0011
2019-04-26
Vue表单数据自动收集---vue工作笔记0012
2019-04-26
Vue生命周期---vue工作笔记0013
2019-04-26