原生SQL的使用、flask-sqlalchemy、flask-migrate的使用

发布时间 2023-11-27 21:06:38作者: Way*yy

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()

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()

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

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 pycharm打开
    2 找到models 把一些注释打开,创建数据库 movie,把main打开
    	-执行 python models.py  # 创建表,插入记录
    3 把原来注释加上
    4 __init__ 改真正的数据库地址
    5 在cmd中执行  python manage.py runserver
    	http://127.0.0.1:5000/admin/