介绍
SQLAlchemy是对数据库的一个抽象
开发者不用直接与SQL语句打交道
Python对象来操作数据库
SQLAlchemy是一个关系型数据库
安装
flask中SQLAlchemy的配置
from flask import Flask
from demo.user_oper import userdef create_app():app = Flask(__name__)# 使用session,就必须设置app.secret_key的值app.secret_key = "1"app.register_blueprint(user, url_prefix="/web")# Flask数据库设置app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@localhost:3308/mp'# 动态追踪修改设置,如未设置只会提示警告,不建议开启app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False# 查询时显示原始SQL语句app.config['SQLALCHEMY_ECHO'] = Truereturn app
创建SQLAlchemy的db对象
from middle_aware import create_app
from flask_sqlalchemy import SQLAlchemyapp = create_app()db = SQLAlchemy()if __name__ == '__main__':app.run(host="0.0.0.0", port=8080)
定义db.Model
db.ForeignKey(表名.字段名) --表示外键
from exts import db# 数据库模块需要继承db.Model
class User(db.Model):# 定义表名__tablename__ = "user"# 定义字段id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(50), unique=True)password = db.Column(db.String(100))info = db.Column(db.JSON)class Address(db.Model):# 定义表名__tablename__ = "address"# 定义字段id = db.Column(db.Integer, primary_key=True)user_id = db.Column(db.Integer, db.ForeignKey('user.id'))city = db.Column(db.String(10))
db.session会话管理
在SQLAlchemy中插入、修改、删除操作,均由数据库会话管理。
会话用db.session表示。在准备把数据写入数据库前,要现将数据添加到会话中,然后调用commit()方法提交会话。
db.session.add(user) 添加到数据库的session中。
db.session.add_all([user1, user2]) 添加多个信息到session中。
db.session.commit() 提交数据库的修改
db.session.rollback() 数据库的回滚操作
db.session.delete(user) 删除数据库,需要commit。
删除数据库中所有表结构,重新根据Model中的定义创建新的表结构
db.create_all() 可以根据定义的Model创建表,在给定的数据库中。
db.drop_all() 删除数据库中所有的表。
from flask import Flask
import config
from exts import db
from demo.views.user_oper2 import user2
from demo.user_oper import userapp = Flask(__name__)
# 绑定配置文件
app.config.from_object(config)
app = Flask(__name__)
# 使用session,就必须设置app.secret_key的值
app.secret_key = "1"
app.register_blueprint(user, url_prefix="/web")
app.register_blueprint(user2, url_prefix="/test")# Flask数据库设置
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@localhost:3308/python_db?charset=utf8'
# 动态追踪修改设置,如未设置只会提示警告,不建议开启
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 查询时显示原始SQL语句
app.config['SQLALCHEMY_ECHO'] = Truedb.init_app(app)if __name__ == '__main__':# 一定要在Flask 应用上下文的环境中调用了这个方法with app.app_context():# 删除所有表db.drop_all()# 根据model文件中定义的表结构创建表db.create_all()app.run(host="0.0.0.0", port=8080)
数据类型定义
db.session.add_all([user1, user2]) 批量添加数据
@user2.route("/addBatch", methods=['GET'])
def add_batch_user():num = range(5)user_list = []for i in num:user_list.append(User(username='xkj{}'.format(i), password="111111", info={'info':'test'}))db.session.add_all(user_list)db.session.commit()return "success"
用户表添加一条记录后,提交事务,产生唯一标识,可直接取出传入下一个地址表中,建立关联关系
@user2.route("/add_user_address", methods=['GET'])
def add_user_address():user = User(username='小蘑菇', password='123', info={"info": "xxx"})db.session.add(user)db.session.commit()# 提交事务后,新增的用户,就能获取到用户的主键idaddress = Address(user_id=user.id, city="成都")db.session.add(address)db.session.commit()return "success"
# 打印出所有蓝图的接口访问地址
print(app.url_map)
修改表数据操作
@user2.route("/upd_user", methods=['GET'])
def upd_user():update_user = db.session.query(User).filter(User.id == 1).first()if update_user:update_user.username = '大王'db.session.commit()return "update success"
删除数据库表中数据的操作
@user2.route("/del_user", methods=['GET'])
def del_user():update_user = db.session.query(User).filter(User.id == 1).first()if update_user:db.session.delete(update_user)db.session.commit()return "delete user"