另一个框架叫做Flask-SQLAlchemyFlask-SQLAlchemy是对SQLAlchemy进行了一个简单的封装,使得我们在flask中使用sqlalchemy更加的简单。可以通过pip install flask-sqlalchemy进行安装

1、数据库的初始化

在Flask-SQLALchemy中,数据库的初始化不在是通过create_engine

  1. ENGINE = f"mysql+mysqlconnector://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"
  2. engine = create_engine(ENGINE)

而是采用如下的方式:

  1. from flask import Flask
  2. from flask_sqlalchemy import SQLAlchemy
  3. USERNAME = "root"
  4. PASSWORD = "147258"
  5. DATABASE = "gongzhujun"
  6. PORT = 3306
  7. HOSTNAME = "127.0.0.1"
  8. ENGINE = f"mysql+mysqlconnector://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"
  9. app = Flask(__name__)
  10. # 相当于engine = create_engine(ENGINE)
  11. app.config["SQLALCHEMY_DATABASE_URI"] = ENGINE
  12. # 防止出现警告
  13. app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
  14. # 代替了原来的Base = declarative_base(engine)以及session = sessionmaker(bind=engine)()
  15. db = SQLAlchemy(app)
  16. @app.route("/")
  17. def home():
  18. return "首页"
  19. if __name__ == '__main__':
  20. app.run(debug=True)

代码解读:
导入插件:通过flask_sqlalchemy建立flask和sqlalchemy的联系

  1. from flask_sqlalchemy import SQLAlchemy

通过配置config的方式建立引擎,相当于替换了原先的engine = create_engine(ENGINE)

  1. app.config["SQLALCHEMY_DATABASE_URI"] = ENGINE

通过db = SQLAlchemy(app)将原本创建基类以及调用sessionmaker的功能进行了替代

  1. db = SQLAlchemy(app)

防止出现警告:

  1. app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False

2、模型建立

ORM类:之前都是通过Base = declarative_base()来初始化一个基类,然后再继承,在Flask-SQLAlchemy中更加简单了

  1. # 继承的基类是db.Model,而不是Base了
  2. class Students(db.Model):
  1. from flask import Flask
  2. from flask_sqlalchemy import SQLAlchemy
  3. USERNAME = "root"
  4. PASSWORD = "147258"
  5. DATABASE = "gongzhujun"
  6. PORT = 3306
  7. HOSTNAME = "127.0.0.1"
  8. ENGINE = f"mysql+mysqlconnector://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"
  9. app = Flask(__name__)
  10. # 相当于engine = create_engine(ENGINE)
  11. app.config["SQLALCHEMY_DATABASE_URI"] = ENGINE
  12. # 防止出现警告
  13. app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
  14. # 代替了原来的Base = declarative_base(engine)以及session = sessionmaker(bind=engine)()
  15. db = SQLAlchemy(app)
  16. # 建立模型
  17. class Students(db.Model):
  18. __tablename__ = "students"
  19. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  20. name = db.Column(db.String(20), nullable=False)
  21. age = db.Column(db.Integer)
  22. uid = db.Column(db.Integer, db.ForeignKey("classroom.id"))
  23. classroom = db.relationship("ClassRoom", backref="students")
  24. __mapper_args__ = {
  25. "order_by": age
  26. }
  27. def __str__(self):
  28. return f"Students[name: {self.name}, age: {self.age}]"
  29. class ClassRoom(db.Model):
  30. __tablename__ = "classroom"
  31. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  32. name = db.Column(db.String(20), nullable=False)
  33. def __str__(self):
  34. return f"ClassRoom[name: {self.name}]"
  35. # 映射数据库
  36. # Base.metadata.create_all()
  37. db.create_all()
  38. @app.route("/")
  39. def home():
  40. return "首页"
  41. if __name__ == '__main__':
  42. app.run(debug=True)

代码解读:
之前需要通过sqlalchemy导入很多的方法(from sqlalchemy import Column, String),但是在flask_sqlalchemy中,相关的方法,只需要通过自己定义的”db”进行相关的操作(db.Column(), db.Formary_key()),当然参数以及模型自身内部的方法不需要加db前缀

  1. db = SQLAlchemy(app)

如下:

  1. class Students(db.Model):
  2. __tablename__ = "students"
  3. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  4. name = db.Column(db.String(20), nullable=False)
  5. age = db.Column(db.Integer)
  6. uid = db.Column(db.Integer, db.ForeignKey("classroom.id"))
  7. classroom = db.relationship("ClassRoom", backref="students")
  8. __mapper_args__ = {
  9. "order_by": age
  10. }
  11. def __str__(self):
  12. return f"Students[name: {self.name}, age: {self.age}]"

映射数据库:

  1. # 删除数据库
  2. # Base.metadate.drop_all()
  3. # db.drop_all()
  4. # 映射数据库
  5. # Base.metadata.create_all()
  6. db.create_all()

3、数据添加

和sqlalchemy中的操作相似,只是不需要session = sessionmaker(bind=engine)()

  1. student = Students(name="龚祝俊", age=18)
  2. classroom = ClassRoom(name="物流三班")
  3. student.classroom = classroom
  4. # 增加数据
  5. db.session.add(student)
  6. # 提交数据库
  7. db.session.commit()

4、数据查询

方法一:(通过 模型名.query.all())的方式,更加的便捷,但是可能需要使用repr(self)的方式
同样的过滤以及分组加在query后面即可

  1. # 这里的query是不用括号的
  2. data = ClassRoom.query.all()
  3. print(data)

方法二: (通过 db.session.query(模型名).all())session变成了db的属性,其余方法同理

  1. data = db.session.query(ClassRoom).all()
  2. print(data)

5、数据的排序(过滤,分组,having同理)

方法一:

  1. datas = ClassRoom.query.order_by(ClassRoom.id.desc()).all()
  2. for data in datas:
  3. print(data)

方法二:

  1. datas = db.session.query(ClassRoom).order_by(ClassRoom.id.desc()).all()
  2. for data in datas:
  3. print(data)

5、数据的删除和修改

第一步:查询数据,第二步删除或者修改数据
小例子:将龚祝俊修改为吴艳新

  1. datas = db.session.query(Students).filter(Students.name == "龚祝俊").first()
  2. datas.name = "吴艳新"
  3. db.session.commit()

小例子:删除江一号的所在数据:

  1. datas = db.session.query(Students).filter(Students.name == "江一号").first()
  2. db.session.delete(datas)
  3. db.session.commit()