介绍
SQLAlchemy是对数据库的一个抽象
开发者不用直接与SQL语句打交道
Python对象来操作数据库
SQLAlchemy是一个关系型数据库
安装
flask中SQLAlchemy的配置
python
from flask import Flask
from demo.user_oper import user
def 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'] = True
return app
创建SQLAlchemy的db对象
python
from middle_aware import create_app
from flask_sqlalchemy import SQLAlchemy
app = create_app()
db = SQLAlchemy()
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8080)
定义db.Model
db.ForeignKey(表名.字段名) --表示外键
python
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() 删除数据库中所有的表。
python
from flask import Flask
import config
from exts import db
from demo.views.user_oper2 import user2
from demo.user_oper import user
app = 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'] = True
db.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]) 批量添加数据
python
@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"
用户表添加一条记录后,提交事务,产生唯一标识,可直接取出传入下一个地址表中,建立关联关系
python
@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()
# 提交事务后,新增的用户,就能获取到用户的主键id
address = Address(user_id=user.id, city="成都")
db.session.add(address)
db.session.commit()
return "success"
python
# 打印出所有蓝图的接口访问地址
print(app.url_map)
修改表数据操作
python
@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"
删除数据库表中数据的操作
python
@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"