好耶,七天课程的最后一天!我当然还没精通了,,,之后可能是多练习题目然后再学学其他的东西吧。mysql新的知识点也会在后面补充的。

一、杂七杂八补充

1. 当多个函数共用同样的参数时,可以转变成类进行。

  面向对象:数据与逻辑组合在一起

  函数编程:数据与逻辑分离

  1. #进行意会的伪代码
  2. class SqlHelper:
  3. def __init__(self): #需要重复使用的数据, 在__init__里面封装多个函数需要共同使用的东西
  4. self.host = ''
  5. self.port =''
  6. self.db =''
  7. self.charset=''
  8.  
  9. def exc1(self,SQL):
  10. # 连接
  11. conn(self.host,)
  12. execute(SQL)
  13. return xx
  14.  
  15. def exc2(self,proc_name):
  16. callproc(proc_name)
  17. return xxx

2. 类:提取共性。

  一类事物共同具有的属性和行为。如一张表里面如果只有id与name两列,那么对表的操作一定是对这两列的操作(额,我Python不知道如何对类进行操作,等我学了对类的操作后,我再返回来检查一下这里的代码)

  1. class Userinfo:
  2.  
  3. def __init__(self,id,name):
  4. #约束’每个对象中只有两个字段,即:每个行数据都有id和name列
  5. self.id = id
  6. self.name= name
  7. def add(self,name):
  8. pass
  9.  
  10. # row1 = UserInfo(1,'alex') # 第一行
  11. # row2 = UserInfo(2,'alex') # 第二行

3. 每一个对象里面具体的特殊方法(我服了,云里雾里就是我!我还会再回来的!)

  1. class Foo:
  2. def __init__(self,name):
  3. self.name = name
  4.  
  5. def show(self):
  6. print(self.name)
  7.  
  8. def __call__(self):
  9. pass
  10.  
  11. def __getitem__(self,key):
  12. pass
  13.  
  14. def __setitem__(self,key,value):
  15. pass
  16.  
  17. def __delitem__(self,key):
  18. pass
  19.  
  20. obj1 = Foo('eric')
  21.  
  22. obj1() #这个是Python中的特殊用法
  23. obj1['k']
  24. obj1['k'] = 123
  25. del obj[k] #删除
  26. obj.__dict__

 二、ORM框架:SQLAlchemy

参考博文戳这里

1. 作用:提供简单规则,自动转换成SQL语句。

2. 两类框架

(1)DB first

先手动创建数据库与表,根据数据库里面的表自动生成类

(2)code first

手动创建类与数据库,自动生成与表(ORM所属类别)

3. 功能

(1)创建数据库表

  1. from sqlalchemy import create_engine
  2. from sqlalchemy.ext.declarative import declarative_base
  3. from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index,CHAR,VARCHAR
  4. from sqlalchemy.orm import sessionmaker, relationship
  5.  
  6. Base = declarative_base()
  7. # 创建单表——users继承base
  8. class UserType(Base):
  9. __tablename__ = 'usertype'
  10. #下面的三个变量创建好后会自动变到__init__里面,成为类里面的通用变量
  11. id = Column(Integer, primary_key=True, autoincrement=True)
  12. title = Column(String(32), nullable=True, index=True)
  13.  
  14. class Users(Base):
  15. __tablename__ = 'users'
  16. #下面的三个变量创建好后会自动变到__init__里面,成为类里面的通用变量
  17. id = Column(Integer, primary_key=True, autoincrement=True)
  18. name = Column(String(32), nullable=True, index=True, default='sf')
  19. email = Column(String(16), nullable=True, unique=True) #unique=True表示建立唯一索引
  20. #创建主键
  21. user_type_id = Column(Integer,ForeignKey("usertype.id"))
  22.  
  23. #设定规则
  24. __table_args__ = (
  25. UniqueConstraint('id', 'name', name='uix_id_name'), #id与name当成联合唯一索引,名字叫'uix_id_name'
  26. Index('ix_id_name','name', 'email'), #建立普通索引,名字叫'ix_id_name',注意,名字要写在前面
  27. )
  28.  
  29. #将创建表封装成函数
  30. def create_db():
  31. #max_overflow表示最多与数据库建立5个链接,最多可以发五条信息,实际上就是指“connection pool”这个连接池
  32. engine = create_engine("mysql+pymysql://root:@localhost:3306/s7day", max_overflow = 5)
  33. #找到py文件中继承了base的类,创建表
  34. Base.metadata.create_all(engine)
  35.  
  36. #将删除表封装成函数
  37. def drop_db():
  38. engine = create_engine("mysql+pymysql://root:@localhost:3306/s7day", max_overflow=5)
  39. #默认会把base类对应的表都删掉
  40. Base.metadata.drop_all(engine)

    #调用时
    create_db()
    drop_db()

  a.链接数据库(不是SQLAlchemy处理的,是pymysql/mysqlDB处理的)

  b.把类转换成sql语句进行操作(SQLAlchemy进行语句的转换,然后提交给给pymysql进行处理)

  1. #SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:
  2.  
  3. #MySQL-Python
  4. mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
  5.  
  6. #pymysql
  7. mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
  8.  
  9. #MySQL-Connector
  10. mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
  11.  
  12. #cx_Oracle
  13. oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
  14.  
  15. 更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html

(2)操作数据行

a. 增

  1. #创建连接
  2. engine = create_engine("mysql+pymysql://root:@localhost:3306/s7day", max_overflow=5)
  3. Session = sessionmaker(bind = engine)
  4. #从5个连接中取出一个链接
  5. session = Session()
  6.  
  7. #类代指表,对象代指一行数据
  8.  
  9. #增加用户——一条增加
  10. obj1 = UserType(title="bbb")
  11. session.add(obj1) #转换成sql语句
  12.  
  13. #增加用户——多条增加
  14. objs = [
  15. UserType(title="普通用户1"),
  16. UserType(title="普通用户2"),
  17. UserType(title="普通用户3")
  18. ]
  19. session.add_all(objs)
  20. session.commit()

b. 查

  1. #创建连接
  2. engine = create_engine("mysql+pymysql://root:@localhost:3306/s7day", max_overflow=5)
  3. Session = sessionmaker(bind = engine)
  4. #从5个连接中取出一个链接
  5. session = Session()
  6.  
  7. #查询数据——类是表的含义,所以要去类里面查询
  8. # print(session.query(UserType)) #输出的是SQL语句SELECT usertype.id AS usertype_id, usertype.title AS usertype_title FROM usertype
  9. usertype_list = session.query(UserType).all()
  10. # print(usertype_list) #输出是列表,列表里面是对象,即数据行
  11. for row in usertype_list:
  12. print(row.id, row.title) #得到用户具体信息
  13.  
  14. #查询筛选
  15. usertype_list = session.query().filter(UserType.id > 2) #全部返回
  16. for row in usertype_list:
  17. print(row.id, row.title)
  18.  
  19. usertype_list = session.query(usertype_list.id).filter(UserType.id > 2) #只返回id
  20.  
  21. session.close()

c. 删

  1. #创建连接
  2. engine = create_engine("mysql+pymysql://root:@localhost:3306/s7day", max_overflow=5)
  3. Session = sessionmaker(bind = engine)
  4. #从5个连接中取出一个链接
  5. session = Session()
  6.  
  7. #删除数据前要先查找到需要删除的数据
  8. usertype_list = session.query(UserType).filter(UserType.id>2).delete() #将查询到的全部删除(可以不赋值给一个变量)
  9. # for row in usertype_list:
  10. # print(row.id, row.title)
  11. print(usertype_list) #返回的是删除的条数
  12.  
  13. session.commit()
  14. session.close()

d. 改——更新

  1. #更新输入的是字典
  2.  
  3. #整体修改成一样的值
  4. session.query(UserType).filter(UserTpye.id > 2).update({"title" : "099"})
  5. #字符拼接拼接:在原来的title的基础上加“099”
  6. session.query(UserType).filter(UserType.id > 2).update({UserType.title: UserType.title + "099"}, synchronize_session=False)
  7. #在原来数值的基础上+1
  8. session.query(UserType).filter(UserType.id > 2).update({"num": UserType.num + 1}, synchronize_session="evaluate")
  9. session.commit()
  10. e. 其他汇总
  11.  
  12. # 条件
  13. ret = session.query(Users).filter_by(name='alex').all() #括号内传的是参数,在内部会调用filter
  14. ret = session.query(Users).filter(Users.id > 1, Users.name == 'eric').all() #k括号内传的是表达式
  15. ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == 'eric').all()
  16. ret = session.query(Users).filter(Users.id.in_([1,3,4])).all()
  17. ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all() #~指not in
  18. ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all()
  19. from sqlalchemy import and_, or_
  20. ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all()
  21. ret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all()
  22. ret = session.query(Users).filter(
  23. or_(
  24. Users.id < 2,
  25. and_(Users.name == 'eric', Users.id > 3),
  26. Users.extra != ""
  27. )).all()
  28.  
  29. # 通配符
  30. ret = session.query(Users).filter(Users.name.like('e%')).all()
  31. ret = session.query(Users).filter(~Users.name.like('e%')).all() #~表示对立面
  32.  
  33. # 限制
  34. ret = session.query(Users)[1:2] #其实就是limit
  35.  
  36. # 排序
  37. ret = session.query(Users).order_by(Users.name.desc()).all()
  38. ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()
  39.  
  40. # 分组
  41. from sqlalchemy.sql import func
  42.  
  43. ret = session.query(Users).group_by(Users.extra).all()
  44. ret = session.query(
  45. func.max(Users.id), #聚合函数
  46. func.sum(Users.id),
  47. func.min(Users.id)).group_by(Users.name).all()
  48.  
  49. ret = session.query(
  50. func.max(Users.id),
  51. func.sum(Users.id),
  52. func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all()
  53.  
  54. # 连表
  55. #将Users, UserType两张表以笛卡尔积的形式进行链接,返回的是两张表的所有数据,不存在链接关键词
  56. #SELECT users.id AS users_id, users.name AS users_name, users.email AS users_email, users.user_type_id AS users_user_type_id, usertype.num AS usertype_num, usertype.id AS usertype_id, usertype.title AS usertype_title FROM users, usertype
  57. ret = session.query(Users, UserType)
  58.  
  59. #相当于inner join,没有空值
  60. #SELECT users.id AS users_id, users.name AS users_name, users.email AS users_email, users.user_type_id AS users_user_type_id, usertype.num AS usertype_num, usertype.id AS usertype_id, usertype.title AS usertype_title FROM users, usertype WHERE users.id = usertype.id
  61. ret = session.query(Users, UserType).filter(Users.id == UserType.id).all()
  62.  
  63. #相当于inner join, 在两张表有外键关系的情况下,不用设置链接列
  64. ret = session.query(Users).join(UserType).all()
  65.  
  66. #相当于left join
  67. ret = session.query(Users).join(UserType, isouter=True).all()
  68.  
  69. # 组合
  70. q1 = session.query(Users.name).filter(Users.id > 2)
  71. q2 = session.query(Favor.caption).filter(Favor.nid < 2)
  72. ret = q1.union(q2).all()
  73.  
  74. q1 = session.query(Users.name).filter(Users.id > 2)
  75. q2 = session.query(Favor.caption).filter(Favor.nid < 2)
  76. ret = q1.union_all(q2).all() #不去重
  77.  
  78. #子查询
  79. #1.select * from usertype where id in (select id from usertype.user_name = 'alex')
  80. session.query(UserType).filter(
  81. UserType.id.in_(session.query(Users.id).filter(Users.name == 'alex'))
  82. ).all()
  83.  
  84. #2. 临时表类型——select * from (select * from usertype where id > 2) as B
  85. session.query(session.query(UserType).filter(UserType.id > 2).subquery()) #重点在于这个subquery()
  86.  
  87. #3. select id, (select * from usertype) from users
  88. result = session.query(Users.id, Users.name, session.query(UserType.title).filter(Users.user_type_id==UserType.id).as_scalar()) #重点在于这个as_scalar()

4. SQLAlchemy中的relationship(***)

relationship写在有foreign key的类中

问题一:获取用户信息以及与其关联的用户类型名称

  1. #解决方法一:使用连表操作
  2. user_list = session.query(Users,UserType).join(UserType,isouter=True)
  3. print(user_list)
  4. for row in user_list:
  5. print(row[0].id,row[0].name,row[0].email,row[0].user_type_id,row[1].title)
  6.  
  7. user_list = session.query(Users.name,UserType.title).join(UserType,isouter=True).all() #不加all也能拿,不加all相当于一个迭代器,一次一次拿,加上all一下子拿完
  8. for row in user_list:
  9. print(row)

解决方案一

  1. #解决方案二
  2.  
  3. #在创建数据表时设立relationship
  4. class Users(Base):
  5. __tablename__ = 'users'
  6. id = Column(Integer, primary_key=True, autoincrement=True)
  7. name = Column(VARCHAR(32), nullable=True, index=True)
  8. email = Column(VARCHAR(16), unique=True)
  9. user_type_id = Column(Integer,ForeignKey("usertype.id"))
  10.  
  11. user_type = relationship("UserType",backref='xxoo')
  12. )
  13.  
  14. type_list = session.query(Users)
  15. for row in type_list:
  16. print(row.id,row.name,user_type.title)

解决方案二

问题二:获取不同用户类型下的用户

  1. #解决方法一
  2. type_list = session.query(UserType)
  3. for row in type_list:
  4. print(row.id,row.title,session.query(Users).filter(Users.user_type_id == row.id).all())

解决方法一

  1. #解决方法二
  2. class Users(Base):
  3. __tablename__ = 'users'
  4. id = Column(Integer, primary_key=True, autoincrement=True)
  5. name = Column(VARCHAR(32), nullable=True, index=True)
  6. email = Column(VARCHAR(16), unique=True)
  7. user_type_id = Column(Integer,ForeignKey("usertype.id"))
  8.  
  9. user_type = relationship("UserType",backref='xxoo') "xxoo"是提供给usertype使用的
  10. )
  11.  
  12. type_list = session.query(UserType)
  13. for row in type_list:
  14. print(row.id,row.title,row.xxoo)

解决方案二

relationship中的“正向操作”与反向操作

MySQL学习笔记(六)的更多相关文章

  1. MySQL学习笔记(六):索引

    本文主要介绍MySQL 中关于索引的一些问题,例如:索引的作用:怎么创建索引:设计索引的原则:怎么优化索引等等. 一:索引概述 索引一般是通过排序,然后查找时可以二分查找,这一特点来达到加速查找的目的 ...

  2. MySQL学习笔记六:基本DML操作

    1.查询语句,语法如下: SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESUL ...

  3. 初识mysql学习笔记

    使用VMVirtualBox导入Ubuntu后,可以通过sudo apt-get install mysql-server命令下载mysql. 在学习过程中,我遇到了连接不上Xshell的问题.最终在 ...

  4. MySQL学习笔记-大纲

    软件程序性能测试在之前<品味性能之道>系列中已经大量提到,讲解了很多测试方法.测试观念.测试思想等等.最近准备深入MySQL进行学习并总结.分别查阅<MySQL性能调优与架构设计&g ...

  5. mysql basic operation,mysql总结,对mysql经常使用语句的详细总结,MySQL学习笔记

    mysql> select * from wifi_data where dev_id like "0023-AABBCCCCBBAA" ; 1.显示数据库列表.show d ...

  6. Mysql学习笔记(三)对表数据的增删改查。

    正文内容. 这一部分是最简单的,也是最麻烦的.简单是因为其实只包括增删该插四个部分.大体上看,增加数据.删除数据.修改数据.查询数据都不麻烦啊,我们日常都是常用的.这个谁不会呢?以前在培训机构学mys ...

  7. MySQL学习笔记一

    MySQL 学习笔记 一 一.数据库简单介绍 1. 按照数据库的发展时间顺序,主要出现了以下类型数据库系统: Ø 网状型数据库 Ø 层次型数据库 Ø 关系型数据库 Ø 面向对象数据库 上面4中数据库系 ...

  8. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  9. Mysql学习笔记(二)数据类型 补充

    原文:Mysql学习笔记(二)数据类型 补充 PS:简单的补充一下数据类型里的String类型以及列类型... 学习内容: 1.String类型 2.列类型存储需求 String类型: i.char与 ...

  10. Mysql学习笔记(一)数据类型

    原文:Mysql学习笔记(一)数据类型 学习内容: Mysql基本数据类型. 1.数字类型.. i.整型     Mysql数据类型             含义(有符号)     tinyint(m ...

随机推荐

  1. 织梦dedecms首页、列表页、文章页文章点击浏览次数实时调用方法

    首先呢,先在根目录 /plus 目录下找到count.php  复制一份然后命名为viewclick.php(你也可以命名为你容易理解的名字)用编辑器将viewclick.php打开然后删除以下几行代 ...

  2. 2015 Multi-University Training Contest 1(7/12)

    2015 Multi-University Training Contest 1 A.OO's Sequence 计算每个数的贡献 找出第\(i\)个数左边最靠右的因子位置\(lp\)和右边最靠左的因 ...

  3. Java_web项目中在Java文件里面通过类装载器对资源文件读取

    承接上一节:在eclipse完成对Java_web项目里面资源文件的读取 我们首先在src目录下创建一个资源文件db.properties 内容如下: url=127.0.0.1 name=root ...

  4. P1714 切蛋糕 dp+单调队列

    题意: 题目描述 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精. 某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪露诺决定到 ...

  5. POJ1087 A Plug for UNIX(网络流)

    在会议开始之前,你收集所有记者想要使用的设备,并尝试设置它们.你注意到有些设备使用没有插座的插头.你想知道这些设备是否来自建造这个房间时并不存在的国家.对于一些插座,有几个设备使用相应的插头.对于其他 ...

  6. 洛谷 P6225 [eJOI2019]异或橙子 (树状数组)

    题意:有\(n\)个数,起始值均为\(0\),进行\(q\)次操作,每次输入三个数,如果第一个数为\(1\),则将第\(i\)个数修改为\(j\),如果为\(2\),则求区间\([l,r]\)内的所有 ...

  7. Detect the Virus ZOJ - 3430 AC自动机

    One day, Nobita found that his computer is extremely slow. After several hours' work, he finally fou ...

  8. 国产网络测试仪MiniSMB - 如何3秒内创建出16,000条IP递增流

    国产网络测试仪MiniSMB(www.minismb.com)是复刻smartbits的IP网络性能测试工具,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此以太 ...

  9. 创建java文件和注释

    创建java文件和注释 一 创建java文件 在文件夹里创建txt文本文件,后将格式改为.java, 输入 1 public class Hello{ 2 public static void mai ...

  10. [Golang]-6 超时处理、非阻塞通道操作、通道的关闭和遍历

    目录 超时处理 非阻塞通道操作 通道的关闭 通道遍历 超时处理 超时 对于一个连接外部资源,或者其它一些需要花费执行时间的操作的程序而言是很重要的. 得益于通道和 select,在 Go中实现超时操作 ...