day38


day38

内容回顾

面向对象

  1. 提取共性

  2. 分类

  3. 模板“约束”

  4. 当一类函数公用同样参数时候,可以转变成类进行—分类

  5. 区别:

    • 面向对象:数据和逻辑(属性和行为)组合在一起

    • 函数编程:数据和逻辑分离

  6. 特殊方法:

    class Foo:
       def __init__(self,name):
           self.name = name
           
       def show(self):
           print(self.name)
           
       def __call__(self):
           pass
       def __getitem__(self,key):
           pass
       def __setitem__(self,key,value):
           pass
       def __delitem__(self,key):
           pass
    obj = Foo("eric")
    obj()
    obj["k"]
    obj["k"]=1243
    del obj[k]
    obj.__dict__

     

pymysql

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
 
# 创建连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
# 创建游标
cursor = conn.cursor()
 
# 执行SQL,并返回收影响行数
effect_row = cursor.execute("update hosts set host = '1.1.1.2'")
 
# 执行SQL,并返回受影响行数
#effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))
 
# 执行SQL,并返回受影响行数
#effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
 
 
# 提交,不然无法保存新建或者修改的数据
conn.commit()
 
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
# 获取最新自增ID
new_id = cursor.lastrowid
注:在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:
?
cursor.scroll(1,mode='relative')  # 相对当前位置移动
cursor.scroll(2,mode='absolute') # 相对绝对位置移动

 

今日内容

1.ORM框架:SQLAlchemy

  • pip3 install SQLAlchemy

  • SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:

  • 作用:

    1. 提供简单的规则

    2. 自动转换成sql语句

1.2两类ORM框架

  • DB first

    • 手动创建数据库以及表然后ORM框架和自动生成类

  • code first

    • 手动创建类和数据库然后ORM框架和自动生成表

1.3功能

  • 创建数据库表

    • 连接数据库(非做的SQLAlchemy,是做的pymysql,mysqldb,)

    • 类转换成sql语句

  • 工作流程

    1. SQLAlchemy ORM

      1. Object Relatlonal Mapper(ORM) #可以看作类

      2. 类和2.1,2.2配合起来将其转换为sql语句

    2. SQLAlchemy Core

      1. Schema/types

      2. SQL Expression Language

      3. Engine #引擎(配置文件会给引擎)

        1. Connection Pooling #连接池(保持多少个连接)

        2. Diaiect #选择(选择你要连接pymysql,mysqldb......)

    3. DBAPI 代指连接(pymysql,mysqlDB,SQL,Oracle...)

  • 增(做操作的代表行)

    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    from sqlalchemy import create_engine
    ?
    class UserType(Base):
       __tablename__="usertype"
       id = Column(Integer,primary_key=True,autoincrement=True)
       title = Column(String(32),nullable=True,index=True)
    ?
    engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/s4day62db?charset=utf8",max_overflow=5)    #连接mysql数据库
    Session = sessionmaker(bind=engine)    #获取权限
    session=Session()    #获取权限
    #单个添加
    obj1=UserType(title="普通用户")    #在title中添加“普通用户”这个值
    session.add(obj1) #将其写入
    #多个添加
    objs =[
       UserType(title="超级用户")
       UserType(title="白金用户")
       UserType(title="黑金用户")
    ]
    session.add_all(objs)
    session.commit()    #提交
    session.close()    #关闭

     

  • from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    from sqlalchemy import create_engine
    ?
    class UserType(Base):
       __tablename__="usertype"
       id = Column(Integer,primary_key=True,autoincrement=True)
       title = Column(String(32),nullable=True,index=True)
    ?
    engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/s4day62db?charset=utf8",max_overflow=5)    #连接mysql数据库
    Session = sessionmaker(bind=engine)    #获取权限
    session=Session()    #获取权限
    user_type_list = session.query(UserType).filter(UserType.id>2).delete()   #查到满足条件的并删除
    #.delete()   #删除
    session.commit()    #提交
    session.close()    #关闭

     

  • from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    from sqlalchemy import create_engine
    ?
    ?
    class UserType(Base):
       __tablename__="usertype"
       id = Column(Integer,primary_key=True,autoincrement=True)
       title = Column(String(32),nullable=True,index=True)
    ?
    engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/s4day62db?charset=utf8",max_overflow=5)    #连接mysql数据库
    Session = sessionmaker(bind=engine)    #获取权限
    session=Session()    #获取权限
    user_type_list = session.query(UserType).filter(UserType.id>0).update({title:"黑金"})    #查到小于0的id并把title修改为“黑金”
    session.query(Users).filter(Users.id > 2).update({Users.name: Users.name + "099"}, synchronize_session=False)    #字符串做操作时
    session.query(Users).filter(Users.id > 2).update({"num": Users.num + 1}, synchronize_session="evaluate")    ##数值做操作时
    #synchronize_session=False   如果要对字符串操作时必须加、
    #synchronize_session="evaluate"   对数值做操作是必须加
    session.commit()    #提交
    session.close()    #关闭

     

  • from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    from sqlalchemy import create_engine
    ?
    ?
    class UserType(Base):
       __tablename__="usertype"
       id = Column(Integer,primary_key=True,autoincrement=True)
       title = Column(String(32),nullable=True,index=True)
    ?
    engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/s4day62db?charset=utf8",max_overflow=5)    #连接mysql数据库
    Session = sessionmaker(bind=engine)    #获取权限
    session=Session()    #获取权限
    user_type_list = session.query(UserType(你想取那几列可以写在这如:UserType.id"只写表名相当于sql中的*号")).all()   #查询usertype表中的所有记录
    #.all()   是全部
    #.filter(UserType.id>2)   是过滤和sql中的where一样
    print(session.query(UserType))    #可以看到sql代码
    for row in user_type_list:
       print(row.id,row.title)
    ?
    session.commit()    #提交
    session.close()    #关闭
  • 其他

    #条件
    ret = session.query(user).filtr_by(name="alex").all()
    ret = session.query(user).filter(user.id>1,user.name == "eric").all()#逗号分隔开默认是and运算
    ret = session.query(user).filter(user.id.between(1,3),user.name == "eric").all()
    #.between(1,3)
    ret=session.query(user).filter(user.id.in_([1,3,4])).all()    #in_([1,2,3])就代表in
    ret=session.query(user).filter(~user.id.in_([1,3,4])).all()    #~就代表not
    ret = session.query(user).filter(user.id.in_(session.query(user.id).filter_by(name="eric"))).all()#写表达式用filter如果是参数就用filter_by,filter_by在内部就调用的是filter,拿到的是字典在内部会被转成表达式来引用
    from sqlalcheny import and_,or_#如果要用and和or需要导入一下
    ret = session.query(user).filter(and_(user.id>3,user.name == "eric")).all()
    ret = session.query(user).filter(or_(user.id>3,user.name == "eric")).all()#用什么定义就用什么运算
    ret = session.query(user).filter(or_(user.id<2),and_(user.name == "eric",user.id>3)).all()
    #通配符
    ret = session.query(user).filter(user.naem.like("e%")).all()#找到所有e开头的用户
    ret = session.query(user).filter(~user.naem.like("e%")).all()#找到所有不是e开头的用户
    #限制
    ret = session.query(user)[1:2]#这样写是切片
    #排序
    ret = session.query(user).order_by(user.name.desc()).all()
    ret = session.query(user).order_by(user.naem.desc(),user.id.asc()).all()
    #如果姓名出现了重复就用id排序
    #分组
    from sqlalchemy.sql import func  #用之前需要导入一下
    ret = session.query(user).qroup_by(user.extre).all()
    ret = session.query(
    func.max(user.id),
    func.sum(user.id),
    func.min(user.id)).group_by(user.name).all()
    #所有的函数都可以用func点出来
    ret = session.query(
    func.max(user.id),
    func.sum(user.id),
    func.min(user.id)).group_by(user.name).having(func.min(user.id)>2).all()
    #连表
    ret = session.query(user,usertype).filter(user.id == usertype.nid).all()
    ret = session.query(user).join(usertype)
    ret = session.query(user).join(usertype,isouter=True)#加上isouter是左连表
    ?
    #组合
    q1 =session.query(user.name).filter(user.id>2)
    q2 =session.quer(favor.caption).filter(favor.nid<2)
    ret = q1.union(q2).all() #将q1和q2上下连起来,多了个去重的功能
    ?
    q1 =session.query(user.name).filter(user.id>2)
    q2 =session.quer(favor.caption).filter(favor.nid<2)
    ret = q1.union_all(q2).all() #将q1和q2上下连起来,不去重
    ?
    #临时表
    #select * from b where id in ()
    ?
    #select * from (select * from tb) as b
    q1 = session.query(usertype).filter(userType.id>2).subquery()
    #如果要加临时表必须加上subquery()
    result= session.query(q1).all()
    ?
    #select a.id,(select * from b where b.id == a.id)from a   如果要实现这种就要用到.as_scalar()#
    result = session.query(UserType.id,session.query(user).filter(user.id==UserType.id).as_scalat())
    print(result)
    #不加它.as_scalat()是select*from a加了它是(select*from a)不加是没有括号的,想要实现就必须加
    #############################################
    #1.获取用户信息以及与其关联的用户类型名称
    #第一种普通链表
    user_list = session.query(user,UserType).join(UserType,isouter=True)
    print(session)
    for row in user_list:
       print(row[0].id,row[0].name,row[0].email)
    #第二种建立了关系的
    #创建关系就不用频繁的链表了
    user_type = relationship("UserType",backref="xxoo")
    #relationship分为
    #正向操作是根据绑定了外键的那行数据找到id表中的数据
    #反向操作是根据id绑定的外键找到被绑表中的数据,只有加了backref才能使用反向操作
    #relationship写在有foreigexey类中如:
    class User(Base):
       __tablename__ = "user"
       id = Column(Integer,primary_key=True)
       name = Column(String(32),nullable=True,autoincrement=True,dafault="sf",
    index=True)
       email = Column(String(16),unique=True)
       user_type_id = Column(Integer,ForeignKey("usertype.id"))
       relationship("UserType",backref="xxoo")
    ##########################################    
    ?
    user_list = session.query(user)
    for row in user_list:
       print(row.name,row.id,row.user_type.title)
    #2.获取用户类型
    #第一种
    type_list = session.query(UserType)
    for row in type_list:
       print(row.id,row.title,session.query(user).filter(user.user_type_id == row.id).all())
    #第二种
    type_list = session.query(usertype)
    for row in type_list:
       print(row.id,row.title,row.xxoo)
    #注意:加了all是吧所有的数据全部取到内存中,不加的话就和一个迭代器一样,只有在循环的之后才会拿取数据

     

1.4建立表

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine
?
class UserType(Base):
   __tablename__="usertype"
   id = Column(Integer,primary_key=True,autoincrement=True)
   title = Column(String(32),nullable=True,index=True)
?
class User(Base):
   __tablename__ = "user"
   id = Column(Integer,primary_key=True)
   name = Column(String(32),nullable=True,autoincrement=True,dafault="sf",
index=True)
   email = Column(String(16),unique=True)
   user_type_id = Column(Integer,ForeignKey("usertype.id"))
#Column代表列
#primary_key=True 建立主索引
#autoincrement=True 建立自增
#nullable=True是否可以为空
#dafault="sf"默认值
#index=True是否建立索引
#unique=True唯一索引
#oreignKey("usertype.id")外键(约束)
engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/s4day62?charset=utf-8,max_overflow=5")
Base.metadata.create_all(engine)#建立数据表
Base.metadata.drop_all(engine)#删除表
?
#规定写法:用来创建联合索引
__table_args__ = (
#唯一联合索引将id和name创建索引在取个名字
  UniqueConstraint("id","name",name="uix_id_name"),
#建立一个普通索引将name和email建立普通联合索引,普通索引的名字要写到前面
   Index("sdf","name","email",)
)

2.自己开发web框架

2.1.socket

2.2.http协议

2.3.数据库(pymysql,SQLAIchemy)