2019-1-9 15:28:07
还有2天视频flask结束,然后到爬虫了
发现好快 学的东西好多!
到时候来个综合整理!!!!
越努力,越幸运!!!
sqlalchemy 参考连接: https://www.cnblogs.com/wupeiqi/articles/8259356.html
MySQL练习题参考连接: https://www.cnblogs.com/wupeiqi/articles/5729934.html
永远不要高估自己!!
外面下雪了!!整理完今天博客,看会书,晚上看122天视频!
sqlalchemy实例:
models.py
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column from sqlalchemy import Integer,String,Text,Date,DateTime from sqlalchemy import create_engine Base = declarative_base()
# 直接运行就好啦,Django得 python manage makemigrations 和 makemigrate class Users(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(32), index=True, nullable=False) depart_id = Column(Integer) def create_all(): engine = create_engine( "mysql+pymysql://root:123456@127.0.0.1:3306/s9day120?charset=utf8", max_overflow=0, # 超过连接池大小外最多创建的连接 pool_size=5, # 连接池大小 pool_timeout=30, # 池中没有线程最多等待的时间,否则报错 pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置) ) Base.metadata.create_all(engine) def drop_all(): engine = create_engine( "mysql+pymysql://root:123456@127.0.0.1:3306/s9day120?charset=utf8", max_overflow=0, # 超过连接池大小外最多创建的连接 pool_size=5, # 连接池大小 pool_timeout=30, # 池中没有线程最多等待的时间,否则报错 pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置) ) Base.metadata.drop_all(engine) if __name__ == '__main__': drop_all() create_all()
demo.py
from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from models import Users engine = create_engine( "mysql+pymysql://root:123456@127.0.0.1:3306/s9day120?charset=utf8", max_overflow=0, # 超过连接池大小外最多创建的连接 pool_size=5, # 连接池大小 pool_timeout=30, # 池中没有线程最多等待的时间,否则报错 pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置) ) SessionFactory = sessionmaker(bind=engine) # 根据Users类对users表进行增删改查 session = SessionFactory() # ############################## 基本增删改查 ############################### # 1. 增加 # obj = Users(name='alex') # session.add(obj) # session.commit() # session.add_all([ # Users(name='小东北'), # Users(name='龙泰') # ]) # session.commit() # 2. 查 # result = session.query(Users).all() # for row in result: # print(row.id,row.name) # result = session.query(Users).filter(Users.id >= 2) # for row in result: # print(row.id,row.name) # result = session.query(Users).filter(Users.id >= 2).first() # print(result) # 3.删 # session.query(Users).filter(Users.id >= 2).delete() # session.commit() # 4.改 # session.query(Users).filter(Users.id == 4).update({Users.name:'东北'}) # session.query(Users).filter(Users.id == 4).update({'name':'小东北'}) # session.query(Users).filter(Users.id == 4).update({'name':Users.name+"DSB"},synchronize_session=False) # session.commit() # ############################## 其他常用 ############################### # 1. 指定列 # select id,name as cname from users; # result = session.query(Users.id,Users.name.label('cname')).all() # for item in result: # print(item[0],item.id,item.cname) # 2. 默认条件and # session.query(Users).filter(Users.id > 1, Users.name == 'eric').all() # 3. between # session.query(Users).filter(Users.id.between(1, 3), Users.name == 'eric').all() # 4. in # session.query(Users).filter(Users.id.in_([1,3,4])).all() # session.query(Users).filter(~Users.id.in_([1,3,4])).all() # 5. 子查询 # session.query(Users).filter(Users.id.in_(session.query(Users.id).filter(Users.name=='eric'))).all() # 6. and 和 or # from sqlalchemy import and_, or_ # session.query(Users).filter(Users.id > 3, Users.name == 'eric').all() # session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all() # session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all() # session.query(Users).filter( # or_( # Users.id < 2, # and_(Users.name == 'eric', Users.id > 3), # Users.extra != "" # )).all() # 7. filter_by # session.query(Users).filter_by(name='alex').all() # 8. 通配符 # ret = session.query(Users).filter(Users.name.like('e%')).all() # ret = session.query(Users).filter(~Users.name.like('e%')).all() # 9. 切片 # result = session.query(Users)[1:2] # 10.排序 # ret = session.query(Users).order_by(Users.name.desc()).all() # ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all() # 11. group by group_by最后的聚合count 必须用having from sqlalchemy.sql import func # ret = session.query( # Users.depart_id, # func.count(Users.id), # ).group_by(Users.depart_id).all() # for item in ret: # print(item) # # from sqlalchemy.sql import func # # ret = session.query( # Users.depart_id, # func.count(Users.id), # ).group_by(Users.depart_id).having(func.count(Users.id) >= 2).all() # for item in ret: # print(item) # 12.union 和 union all """ select id,name from users UNION select id,name from users; """ # q1 = session.query(Users.name).filter(Users.id > 2) # q2 = session.query(Favor.caption).filter(Favor.nid < 2) # ret = q1.union(q2).all() # # q1 = session.query(Users.name).filter(Users.id > 2) # q2 = session.query(Favor.caption).filter(Favor.nid < 2) # ret = q1.union_all(q2).all() session.close()
metaclass.py
# 1. 类创建的两种方式 # class Foo(object): # a1 = 123 # def func(self): # return 666 # Foo = type("Foo",(object,),{'a1':123,'func':lambda self:666}) # 2. 自定义type # class MyType(type): # pass # # class Foo(object,metaclass=MyType): # a1 = 123 # def func(self): # return 666 # # Foo = MyType("Foo",(object,),{'a1':123,'func':lambda self:666}) # 注意:metaclass作用是指定当前类由谁来创建。 # 3. metaclass class MyType(type): def __init__(self,*args,**kwargs): super(MyType,self).__init__(*args,**kwargs) def __call__(cls, *args, **kwargs): obj = cls.__new__(cls) cls.__init__(obj,*args, **kwargs) return obj class Foo(object,metaclass=MyType): a1 = 123 def __init__(self): pass def __new__(cls, *args, **kwargs): return object.__new__(cls) def func(self): return 666 # Foo是类 # Foo是MyType的一个对象 obj = Foo()
wtforms的实现.py new方法是决定了对象名字, init是构造了一个对象
from flask import Flask,request,render_template,session,current_app,g,redirect from wtforms import Form from wtforms.fields import simple from wtforms.fields import html5 from wtforms.fields import core from wtforms import widgets from wtforms import validators app = Flask(__name__) # FormMeta(type): """ LoginForm._unbound_fields = None LoginForm._wtforms_meta = None """ class LoginForm(Form): name = simple.StringField( validators=[ validators.DataRequired(message='用户名不能为空.'), # validators.Length(min=6, max=18, message='用户名长度必须大于%(min)d且小于%(max)d') ], widget=widgets.TextInput(), render_kw={'placeholder':'请输入用户名'} ) pwd = simple.PasswordField( validators=[ validators.DataRequired(message='密码不能为空.'), # validators.Length(min=8, message='用户名长度必须大于%(min)d'), # validators.Regexp(regex="^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}", # message='密码至少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符') ], render_kw={'placeholder':'请输入密码'} ) x = 123 """ LoginForm._unbound_fields = None LoginForm._wtforms_meta = None LoginForm.name = UnboundField(creation_counter=1,simple.StringField) LoginForm.pwd = UnboundField(creation_counter=2,simple.PasswordField) LoginForm.__str__ = asdf LoginForm.__str__ = asdf LoginForm.__str__ = asdf LoginForm.__str__ = asdf """ @app.route('/login',methods=['GET','POST']) def login(): if request.method == "GET": form = LoginForm() """ 执行formmeta的__call__ LoginForm._unbound_fields = [ ('name',UnboundField(creation_counter=1, simple.StringField),), ('pwd',UnboundField(creation_counter=2,simple.PasswordField,), ] LoginForm.__new__ """ # print(form.name,type(form.name)) # form.name是StringField()对象, StringField().__str__ # print(form.pwd,type(form.pwd)) # form.pwd是PasswordField()对象,PasswordField().__str__ return render_template('login.html',form=form) form = LoginForm(formdata=request.form) if form.validate(): print(form.data) return redirect('https://www.luffycity.com/home') else: # print(form.errors) return render_template('login.html', form=form) if __name__ == '__main__': app.run()
面向对象中的new.py
class Bar(object): pass class Foo(object): def __new__(cls, *args, **kwargs): # return super(Foo,cls).__new__(cls,*args, **kwargs) return Bar() obj = Foo() print(obj) # class Bar(object): # def __init__(self,cls): # self.cls = cls # # class Foo(object): # # def __new__(cls, *args, **kwargs): # # return super(Foo,cls).__new__(cls,*args, **kwargs) # return Bar(cls) # obj = Foo() # print(obj)
贴上笔记!!
s9day120 内容回顾: 记得两句话: 1. 创建类时先执行type的init方法 2. 当一个类实例化时,先执行type的call方法 第一部分:Flask 1. flask和django比较? 2. wsgi? 3. flask上下文理解? 两类: 请求上下文管理 应用上下文管理 流程: 请求到来: 将请求和session相关封装到ctx = RequestContext对象中。 将app和g封装到app_ctx = AppContext对象中。 再通过LocalStack对象将ctx、app_ctx封装到Local对象中。 问题: Local是什么?作用? LocalStack是什么?作用? 获取数据 通过LocalProxy对象+偏函数,调用LocalStack去Local中获取响应ctx、app_ctx中封装的值。 问题: 为什么要把 ctx=request/session app_ctx = app/g ? 答:因为离线脚本需要使用app_ctx。 请求结束: 调用LocalStack的pop方法,将ctx和app_ctx移除。 4. threading.local 5. 偏函数 6. 单例模式 7. 问题: before_request的执行时机(源码实现) 第一部分:MySQL 1. 数据库引擎 2. 数据库授权 3. 表结构设计:代码统计(教育机构,班级表结构设计) 4. SQL语句 https://www.cnblogs.com/wupeiqi/articles/5729934.html 5. 了解:https://www.cnblogs.com/wupeiqi/articles/5713323.html - 视图 - 存储过程 - 触发器 - 函数 select max(id) from tb group by xid; 6. 索引 索引作用:加速查找+约束。 索引种类: - 主键索引:加速查找、不重复、非空 - 唯一索引:加速查找、不重复 - 普通索引:加速查找 - 联合索引:加速查找 - 联合唯一索引:加速查找、不重复 PS:联合索引遵循最左前缀原则。 id name pwd email select * from tb where name='x' select * from tb where name='x' and pwd='123' select * from tb where name='x' and pwd='123' and email='xs' 名词: - 覆盖索引:在索引文件中就可以把想要的数据得到。 select name from tb1; - 索引合并:使用多个单列索引去查找数据。 今日内容: 1. wtforms 2. SQLAlchemy 3. flask-sqlalchemy 内容详细: 1. wtforms 作用:生成HTML标签+用户请求数据进行校验。 使用: - 用户登录示例 - 用户注册示例 - 数据库获取数据实时更新(重写构造方法) 测试:django的form(重写构造方法) 问题: - form对象为什么可以被for循环? 答:变为可迭代对象。 class Foo(object): # def __iter__(self): # return iter([11,22,33]) def __iter__(self): yield 1 yield 2 yield 3 obj = Foo() for item in obj: print(item) - new方法的返回值决定对象到底是什么? class Bar(object): pass class Foo(object): def __new__(cls, *args, **kwargs): # return super(Foo,cls).__new__(cls,*args, **kwargs) return Bar() obj = Foo() print(obj) 记得两句话: - metaclass - 创建类时,先执行type的__init__。 - 类的实例化时,执行type的__call__,__call__方法的的返回值就是实例化的对象。 __call__内部调用: - 类.__new__,创建对象 - 类.__init__,对象的初始化 class MyType(type): def __init__(self,*args,**kwargs): super(MyType,self).__init__(*args,**kwargs) def __call__(cls, *args, **kwargs): obj = cls.__new__(cls) cls.__init__(obj,*args, **kwargs) return obj class Foo(object,metaclass=MyType): a1 = 123 def __init__(self): pass def __new__(cls, *args, **kwargs): return object.__new__(cls) def func(self): return 666 # Foo是类 # Foo是MyType的一个对象 obj = Foo() - 源码: - 类的创建 type.__init__ - 对象的创建 type.__call__ - 类.__new__ - 类.__init__ 2. SQLAlchemy SQLAlchemy,ORM框架。 作用:帮助我们使用类和对象快速实现数据库操作。 数据库: - 原生: - MySQLdb:py2 - pymysql:py2/py3 http://www.cnblogs.com/wupeiqi/articles/5095821.html - ORM框架 - SQLAlchemy SQLAlchemy使用: 参考:https://www.cnblogs.com/wupeiqi/articles/8259356.html 1. 单表操作 表: from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column from sqlalchemy import Integer,String,Text,Date,DateTime from sqlalchemy import create_engine Base = declarative_base() class Users(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(32), index=True, nullable=False) def create_all(): engine = create_engine( "mysql+pymysql://root:123456@127.0.0.1:3306/s9day120?charset=utf8", max_overflow=0, # 超过连接池大小外最多创建的连接 pool_size=5, # 连接池大小 pool_timeout=30, # 池中没有线程最多等待的时间,否则报错 pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置) ) Base.metadata.create_all(engine) def drop_all(): engine = create_engine( "mysql+pymysql://root:123456@127.0.0.1:3306/s9day120?charset=utf8", max_overflow=0, # 超过连接池大小外最多创建的连接 pool_size=5, # 连接池大小 pool_timeout=30, # 池中没有线程最多等待的时间,否则报错 pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置) ) Base.metadata.drop_all(engine) if __name__ == '__main__': create_all() 行: 示例: from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from models import Users engine = create_engine( "mysql+pymysql://root:123456@127.0.0.1:3306/s9day120?charset=utf8", max_overflow=0, # 超过连接池大小外最多创建的连接 pool_size=5, # 连接池大小 pool_timeout=30, # 池中没有线程最多等待的时间,否则报错 pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置) ) SessionFactory = sessionmaker(bind=engine) # 根据Users类对users表进行增删改查 session = SessionFactory() # 1. 增加 # obj = Users(name='alex') # session.add(obj) # session.commit() # session.add_all([ # Users(name='小东北'), # Users(name='龙泰') # ]) # session.commit() # 2. 查 # result = session.query(Users).all() # for row in result: # print(row.id,row.name) # result = session.query(Users).filter(Users.id >= 2) # for row in result: # print(row.id,row.name) # result = session.query(Users).filter(Users.id >= 2).first() # print(result) # 3.删 # session.query(Users).filter(Users.id >= 2).delete() # session.commit() # 4.改 # session.query(Users).filter(Users.id == 4).update({Users.name:'东北'}) # session.query(Users).filter(Users.id == 4).update({'name':'小东北'}) # session.query(Users).filter(Users.id == 4).update({'name':Users.name+"DSB"},synchronize_session=False) # session.commit() session.close() 基本增删改查: # 添加 session.add(对象) session.add_all([ 对象1, 对象2 ]) session.commit() # 查询 session.query(Users).all() session.query(Users).filter(Users.id>4) # 删除 session.query(Users).filter(Users.id>4).delete() # 修改 session.query(Users).filter(Users.id>4).update({Users.age:19}) 常用操作: 见代码示例