另一个框架叫做Flask-SQLAlchemy,Flask-SQLAlchemy是对SQLAlchemy进行了一个简单的封装,使得我们在flask中使用sqlalchemy更加的简单。可以通过pip install flask-sqlalchemy进行安装
1、数据库的初始化
在Flask-SQLALchemy中,数据库的初始化不在是通过create_engine
ENGINE = f"mysql+mysqlconnector://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"
engine = create_engine(ENGINE)
而是采用如下的方式:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
USERNAME = "root"
PASSWORD = "147258"
DATABASE = "gongzhujun"
PORT = 3306
HOSTNAME = "127.0.0.1"
ENGINE = f"mysql+mysqlconnector://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"
app = Flask(__name__)
# 相当于engine = create_engine(ENGINE)
app.config["SQLALCHEMY_DATABASE_URI"] = ENGINE
# 防止出现警告
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
# 代替了原来的Base = declarative_base(engine)以及session = sessionmaker(bind=engine)()
db = SQLAlchemy(app)
@app.route("/")
def home():
return "首页"
if __name__ == '__main__':
app.run(debug=True)
代码解读:
导入插件:通过flask_sqlalchemy建立flask和sqlalchemy的联系
from flask_sqlalchemy import SQLAlchemy
通过配置config的方式建立引擎,相当于替换了原先的engine = create_engine(ENGINE)
app.config["SQLALCHEMY_DATABASE_URI"] = ENGINE
通过db = SQLAlchemy(app)将原本创建基类以及调用sessionmaker的功能进行了替代
db = SQLAlchemy(app)
防止出现警告:
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
2、模型建立
ORM类:之前都是通过Base = declarative_base()来初始化一个基类,然后再继承,在Flask-SQLAlchemy中更加简单了
# 继承的基类是db.Model,而不是Base了
class Students(db.Model):
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
USERNAME = "root"
PASSWORD = "147258"
DATABASE = "gongzhujun"
PORT = 3306
HOSTNAME = "127.0.0.1"
ENGINE = f"mysql+mysqlconnector://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"
app = Flask(__name__)
# 相当于engine = create_engine(ENGINE)
app.config["SQLALCHEMY_DATABASE_URI"] = ENGINE
# 防止出现警告
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
# 代替了原来的Base = declarative_base(engine)以及session = sessionmaker(bind=engine)()
db = SQLAlchemy(app)
# 建立模型
class Students(db.Model):
__tablename__ = "students"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(20), nullable=False)
age = db.Column(db.Integer)
uid = db.Column(db.Integer, db.ForeignKey("classroom.id"))
classroom = db.relationship("ClassRoom", backref="students")
__mapper_args__ = {
"order_by": age
}
def __str__(self):
return f"Students[name: {self.name}, age: {self.age}]"
class ClassRoom(db.Model):
__tablename__ = "classroom"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(20), nullable=False)
def __str__(self):
return f"ClassRoom[name: {self.name}]"
# 映射数据库
# Base.metadata.create_all()
db.create_all()
@app.route("/")
def home():
return "首页"
if __name__ == '__main__':
app.run(debug=True)
代码解读:
之前需要通过sqlalchemy导入很多的方法(from sqlalchemy import Column, String),但是在flask_sqlalchemy中,相关的方法,只需要通过自己定义的”db”进行相关的操作(db.Column(), db.Formary_key()),当然参数以及模型自身内部的方法不需要加db前缀
db = SQLAlchemy(app)
如下:
class Students(db.Model):
__tablename__ = "students"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(20), nullable=False)
age = db.Column(db.Integer)
uid = db.Column(db.Integer, db.ForeignKey("classroom.id"))
classroom = db.relationship("ClassRoom", backref="students")
__mapper_args__ = {
"order_by": age
}
def __str__(self):
return f"Students[name: {self.name}, age: {self.age}]"
映射数据库:
# 删除数据库
# Base.metadate.drop_all()
# db.drop_all()
# 映射数据库
# Base.metadata.create_all()
db.create_all()
3、数据添加
和sqlalchemy中的操作相似,只是不需要session = sessionmaker(bind=engine)()
student = Students(name="龚祝俊", age=18)
classroom = ClassRoom(name="物流三班")
student.classroom = classroom
# 增加数据
db.session.add(student)
# 提交数据库
db.session.commit()
4、数据查询
方法一:(通过 模型名.query.all())的方式,更加的便捷,但是可能需要使用repr(self)的方式
同样的过滤以及分组加在query后面即可
# 这里的query是不用括号的
data = ClassRoom.query.all()
print(data)
方法二: (通过 db.session.query(模型名).all())session变成了db的属性,其余方法同理
data = db.session.query(ClassRoom).all()
print(data)
5、数据的排序(过滤,分组,having同理)
方法一:
datas = ClassRoom.query.order_by(ClassRoom.id.desc()).all()
for data in datas:
print(data)
方法二:
datas = db.session.query(ClassRoom).order_by(ClassRoom.id.desc()).all()
for data in datas:
print(data)
5、数据的删除和修改
第一步:查询数据,第二步删除或者修改数据
小例子:将龚祝俊修改为吴艳新
datas = db.session.query(Students).filter(Students.name == "龚祝俊").first()
datas.name = "吴艳新"
db.session.commit()
小例子:删除江一号的所在数据:
datas = db.session.query(Students).filter(Students.name == "江一号").first()
db.session.delete(datas)
db.session.commit()