首页
仓库
文档
nginx手册
Docker手册
workerman
Flask
PHP
python
RabbitMQ
其他
Linux
占位1
占位2
目录
###依赖包 mysqlclient 和 pymysql 都是用于mysql访问的依赖包, 前者由C语言实现的, 而后者由python实现, 前者的执行效率比后者更高, 但前者在windows系统中兼容性较差, 工作中建议优先前者。 pip install mysqlclient pip install pymysql ###安装 pip install flask-sqlalchemy ###配置 SQLALCHEMY_DATABASE_URI ='mysql://root:mysql@127.0.0.1:3306/test31' #mysqlclient 协议名 SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@127.0.0.1:3306/dbname' #pymysql 协议名 SQLALCHEMY_TRACK_MODIFICATIONS = False 是否更新修改 ###使用 ```python from flask_sqlalchemy import SQLAlchemy #app的实例化 省略 db=SQLAlchemy() #演示模型 class Tag(db.Model): __tablename__ = "tag" id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(100)) title = db.Column(db.String(100)) db.init_app(app) #绑定实例化的flask对象 with app.app_context(): #db.drop_all() #删除所有表 db.create_all() #新建模型类对应的表 ``` ###增加 ```python tdb=Tag(name='张三',title='经理') #创建对象及内容 db.session.add(tdb) #添加 db.session.commit() #提交 print(tdb.id) #获取主键 print(tdb.name) tdb = Tag() #创建对象 tdb.name='李四' #赋值 tdb.title='职员' db.session.add(tdb) #添加 db.session.commit() #提交 print(tdb.id) #获取主键 print(tdb.name) #其他数据 #批量添加 tag1 = Tag(name='张三1', title='经理') tag2 = Tag(name='张三2', title='经理') tag3 = Tag(name='张三3', title='经理') db.session.add_all([tag1, tag2, tag3]) ``` ###更新 ```python #条件更新数据 (过滤更新,就是普通sql) result =Tag.query.filter(Tag.name == '张三2').update({'title': '董事长' }) db.session.commit() print(f"影响的行数: {result}") #根据主键更新数据 tdb=Tag.query.get(100) tdb.title='大boss' db.session.commit() #查询后更新,单条修改还挺香的 user = Tag.query.filter(Tag.name == '张三').first() print('id'+str(user.id)) print(user.title) user.name = '张三三' db.session.commit() # 批量查询后更新(效率低,并发批量查询更新容易锁死) list=Tag.query.filter(Tag.name == '张三').all() #先查询出数据 for item in list: item.title = user.title+'值班' #在更新,也没毛病就是浪费一步查询 db.session.commit() ``` ###删除 ```python #查询删除 user = Tag.query.filter(Tag.name == '李四').first() #先查后删除 print('删除id'+str(user.id)) db.session.delete(user) #删除数据 db.session.commit() #过滤删除 普通SQL模式 result=Tag.query.filter(Tag.name == '张三三').delete() db.session.commit() print(f"删除{result}条") #根据主键删除 tdb = Tag.query.get(133) #本质上就是先查询后删除 db.session.delete(tdb) db.session.commit() ``` ###列表查询 ```python # 列表查询 list=Tag.query.filter(Tag.name=='李四').all() for v in list: print(v.name) #排序,偏移量,显示10条 list = Tag.query.filter(Tag.name == '李四').order_by(Tag.id.desc(), Tag.name.asc()).offset(5).limit(10).all() #filter_by 仅传递关键字就行 list = Tag.query.filter_by(name = '李四').order_by(Tag.id.desc(), Tag.name.asc()).offset(5).limit(10).all() #多条件 tags = Tag.query.filter(Tag.name == '张三').filter(Tag.category == '科技').all() from sqlalchemy import or_ list=Tag.query.filter(or_(Tag.name == '张三',Tag.name == '李四')).all() from sqlalchemy import and_ list=Tag.query.filter(and_(Tag.name == '张三',Tag.name == '李四')).all() #模糊查询 Tag.query.filter(Tag.name.like("%三%")).all() #查询id为[1, 3, 5, 7, 9]的用户 Tag.query.filter(Tag.id.in_([128, 163, 151, 169, 119])).all() #分页查询, 每页3个, 查询第2页的数据 paginate(页码, 每页条数) pn = Tag.query.paginate(page=2, per_page=5) print(pn.pages) #总页数 print(pn.page) #当前页码 print(pn.items) #当前页的数据 print(pn.total) #总条数 # 查询并只选择 id 和 name 字段 result = Tag.query(User.id, User.name).with_entities(User.id, User.name).all() ``` ###单条查询 ```python rs=Tag.query.filter(Tag.id >166).first() #返回模型对象/None #统计查询 count=Tag.query.count() print(f"总记录数:{count}") #根据id查询 rs=Tag.query.get(169) print(rs.id) print(rs.title) ``` ###根据数据库生成模型 ```python pip install sqlacodegen #建议全局安装 #运行方式 #pip install mysqlclient 需要依赖 sqlacodegen mysql://root:111111@127.0.0.1/fld --outfile models.py #pip install pymysql 需要依赖 sqlacodegen mysql+pymysql://root:123456@127.0.0.1/fld --outfile models.py 自动生产的模型文件 from exts import db 导入你自己的db Base = db.Model 改成你的 ``` ###输出SQL #开启 SQLAlchemy 的 echo 模式。这样,所有的 SQL 语句在执行时都会被打印到标准输出或日志中。 app.config['SQLALCHEMY_ECHO'] = True 在文件中配置 from sqlalchemy import event from sqlalchemy.engine import Engine @event.listens_for(Engine, "before_cursor_execute") def before_cursor_execute(conn, cursor, statement, parameters, context, executemany): print("将执行的 SQL: %s" % statement) print("参数: %s" % parameters)