1.9flask sqlalchemy和wtforms

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})
                    
                    常用操作:
                        见代码示例

    

 

转载于:https://www.cnblogs.com/zhen1996/p/10244699.html

Flask SQLAlchemy 是一个用于在 Flask 应用中使用 SQLAlchemy 的扩展。SQLAlchemy 是一个 Python 的 SQL 工具包和对象关系映射(ORM)库,它提供了一种高级的数据库访问方式,使得操作数据库更加方便和灵活。 使用 Flask SQLAlchemy,你可以在 Flask 应用中轻松地定义数据库模型、进行数据库迁移、执行数据库查询和操作等。它将 SQLAlchemy 的功能集成到 Flask 框架中,提供了一种更加便捷的方式来处理数据库相关的任务。 要使用 Flask SQLAlchemy,首先需要安装它。可以使用 pip 命令进行安装: ``` pip install flask_sqlalchemy ``` 安装完成后,在 Flask 应用中导入并初始化 Flask SQLAlchemy 扩展: ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = '数据库连接字符串' db = SQLAlchemy(app) ``` 其中,`app.config['SQLALCHEMY_DATABASE_URI']` 是数据库的连接字符串,用于连接到数据库。你需要根据自己的数据库配置来设置该值。 接下来,你可以定义数据库模型,例如: ```python class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) def __repr__(self): return f'<User {self.username}>' ``` 在上述代码中,我们定义了一个名为 `User` 的模型,它包含了 `id`、`username` 和 `email` 这三个字段。`db.Column` 用于定义字段的类型和约束。 接下来,你可以使用 Flask SQLAlchemy 进行数据库操作,例如插入数据、查询数据等。具体的操作可以参考 Flask SQLAlchemy 的文档和 SQLAlchemy 的文档。 需要注意的是,Flask SQLAlchemy 会自动管理数据库会话,并自动处理数据库连接、事务等细节,使得数据库操作更加简洁和安全。 希望以上信息对你有所帮助!如果有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值