• 8-flask django执行原生sql和sqlalchemy执行原生sql、flask-sqlalchemy使用(filter_by和filter)、flask-migrate使用


    1 原生sql(django-orm如何执行原生sql)
    1.1 django执行原生sql
    1.2 sqlalchemy执行原生sql

    2 flask-sqlalchemy使用
    3 flask-migrate使用

    1 原生sql(django-orm如何执行原生sql)

    1.1 django执行原生sql

    import os
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoProject2.settings')
    import django
    
    django.setup()
    
    from app01.models import Book, User
    
    # 原生sql,方式一,跟对象做映射:
    # book_list=Book.objects.raw('select id,name,price,publish from app01_book where id =2')
    # print(book_list) # RawQuerySet
    # for book in book_list:
    #     print(book.name)
    
    # 了解的,咱们不这么写
    # obj_list = User.objects.raw('select id,name,price,publish from app01_book where id =2')
    # print(obj_list)  # RawQuerySet
    # for obj in obj_list:
    #     print(obj.name)
    #     print(obj.price)
    
    
    ## 方式二,纯原生
    from django.db import connection
    cursor=connection.cursor()
    print(type(cursor))
    cursor.execute('select distinct id, name from app01_book')
    
    from django.db.backends.utils import CursorDebugWrapper # 这个类上没有fetchall, 要么反射进去的,要么执行 . 拦截 __getattr__
    print(cursor.fetchall())
    cursor.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    1.2 sqlalchemy执行原生sql

    ### 第一种:
    # 1  导入
    import sqlalchemy
    from sqlalchemy import create_engine
    from sqlalchemy.engine.base import Engine
    import pymysql
    
    # 2 创建engine对象
    engine = create_engine(
        "mysql+pymysql://root:lqz123?@127.0.0.1:3306/cnblogs",
        max_overflow=0,  # 超过连接池大小外最多创建的连接
        pool_size=5,  # 连接池大小
        pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
        pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
    )
    ########  方式一,纯原生
    # 3 通过engine获得conn,cursor
    # conn = engine.raw_connection()  # 拿到连接对象
    # cursor = conn.cursor()
    # # 4 具体操作
    # cursor.execute('select * from article limit 10')
    # print(cursor.fetchall())
    # cursor.close()
    # conn.close()
    
    
    ### 方式二:通过session
    from sqlalchemy.orm import sessionmaker,scoped_session
    from sqlalchemy.sql import text
    Session = sessionmaker(bind=engine)
    session = scoped_session(Session) # 线程安全的session
    # cursor=session.execute(text('select * from article'))  # 需要用text包一下
    cursor=session.execute(text('select * from article where id = :value'),params={"value":218})  # 需要用text包一下 ,用 :变量名占位
    print(cursor.fetchall())
    cursor.close()
    session.close()
    
    
    ## 方式三:执行原生sql方式三:
    # res = session.query(User).from_statement(text("SELECT * FROM boy where name=:name")).params(name='lqz').all()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    2 flask-sqlalchemy使用

    # sqlalchemy学完了,集成到flask中
    
    ## 纯自己集成:详情见项目
    	1 在models中建立表---》表手动迁移到数据库
        2 单例的 线程安全session,链接mysql,可以使用配置文件
        3 以后在视图函数中,直接使用session操作即可
    
    ## 借助于flask-sqlalchemy
    	1 导入 from flask_sqlalchemy import SQLAlchemy
        2 实例化得到对象
        	db = SQLAlchemy()
        3  将db注册到app中
        	db.init_app(app)
        4 视图函数中使用session
        	全局的db.session  # 线程安全的
        5 models.py 中继承Model
        	db.Model
        6 写字段 
        	username = db.Column(db.String(80), unique=True, nullable=False)
        7 配置文件中加入
        SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root@127.0.0.1:3306/ddd?charset=utf8"
        SQLALCHEMY_POOL_SIZE = 5
        SQLALCHEMY_POOL_TIMEOUT = 30
        SQLALCHEMY_POOL_RECYCLE = -1
        # 追踪对象的修改并且发送信号
        SQLALCHEMY_TRACK_MODIFICATIONS = False
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    3 flask-migrate使用

    # flask-sqlalchemy  不能对字段进行增改,也不能自动把表同步到数据库,表变更记录
    	python manage.py maigrate
    
    # pip3 install flask-migrate
    	-老版本需要结合:flask-script
        -新版本不需要了:flask有自己定制命令
        
    # https://github.com/miguelgrinberg/Flask-Migrate/
    pip3 install Flask-Migrate --upgrade
    4.0.5
    
    ####### 使用
    from flask_migrate import Migrate
    
    app = Flask(__name__)
    app.config.from_pyfile('./settings.py')
    db = SQLAlchemy(app)
    # db.init_app(app)
    migrate = Migrate(app, db) # flask 就会多出好几个命令---》
    
    # flask --app manage:app db init  # 初始化,第一次执行,以后再也不执行了,它执行完,会出现一个migrations文件夹
    # flask --app manage:app db migrate # django中的makemigrations 是一模一样
    # flask --app manage:app db upgrade  # 跟django的migrate一样
    
    
    
    # flask上其他第三方插件
    	cors
        token
        cache
        restful
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
  • 相关阅读:
    Shell脚本初级使用
    利用python中if函数判断三角形的形状
    有关java连接数据库报错的解决方案
    阿里云物联网平台搭建
    Jmeter+Maven+jenkins+eclipse搭建自动化测试平台
    mysql约束之_非空约束
    野火A7学习第一次(简介和学习计划)
    深入理解栈与队列:从基本概念到高级实现
    一文图解Golang管道Channel
    【ASM】字节码操作 工具类与常用类 CheckClassAdapter 介绍
  • 原文地址:https://blog.csdn.net/weixin_44145338/article/details/134553448