1.前言

由于前面大概学习了Flask框架,了解了具体对的操作,所以今天学习操作数据库,使用flask-SQLAlchemy操作数据库!(数据库就使用sqlite3)

2.安装当前的flask-SQLAlchemy

1.使用cmd方式执行pip install flask-sqlalchemy

pip install flask-sqlalchemy

结果如下:

sqlalchemy 更新新版本 sqlalchemy安装以及使用_sqlalchemy 更新新版本


2.查看是否安装当前的flask-sqlalchmy成功

sqlalchemy 更新新版本 sqlalchemy安装以及使用_sqlite_02


发现安装成功!当前的Flask-SQLAlchemy的版本为:Flask-SQLAlchemy 2.4.1

3.查看官方的使用教程

官方的快速教程:Flask-SQLAlchemy快速入门教程

1.直接将当前的app.py中的内容清空写入以下内容:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite3'
db = SQLAlchemy(app)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return '<User %r>' % self.username

当前的app.config[‘SQLALCHEMY_DATABASE_URI’]我设置为sqlite:///db.sqlite3,就表示我才用的是本地的db.sqlite3文件

2.按照官方执行操作,使用命令行执行操作

from app import db

结果:报错

sqlalchemy 更新新版本 sqlalchemy安装以及使用_sqlite_03


3.向当前的app.py中的前面添加这样一句话:app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

sqlalchemy 更新新版本 sqlalchemy安装以及使用_User_04

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite3'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return '<User %r>' % self.username

4.再次执行

sqlalchemy 更新新版本 sqlalchemy安装以及使用_sqlalchemy 更新新版本_05

5.查看当前的db.sqlite3文件

sqlalchemy 更新新版本 sqlalchemy安装以及使用_User_06


sqlalchemy 更新新版本 sqlalchemy安装以及使用_User_07


sqlalchemy 更新新版本 sqlalchemy安装以及使用_sqlite_08


发现当前的官方的操作巨坑,有的时候就会出现错误!

4.分析当前的代码操作

1.首先查看生成的数据库结构:

  1. 当前的id为INTEGER类型并具有自增效果
  2. 当前的username为VARCHAR类型大小为80,不为空
  3. email为VARCHAR类型大小为120,不为空
    查看对应的python代码类
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)

2.分析由于当前的字段生成都是通过当前的db.Column来生成的,通过db.XXX来生成类型的,并可以指定是否为唯一,和不空,使用主键并具有INTEGER是具有自增效果

3.通过查看当前的类class User(db.Model):可以知道生成的表为user,当前的类是通过继承当前的db.Model来实现的(这一点和当前的Django的Model一样)

5.使用SQLAlchemy实现对user表的操作

1.首先将当前的app.py文件中原来的内容放入到一个initdb.py中
2.然后在当前的app.py中添加以下内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<table border="1">
    <tr>
        <th>编号</th>
        <th>用户名</th>
        <th>邮箱</th>
        <th>操作</th>
    </tr>
    {% for u in users %}
        <tr>
            <td>{{ u.id }}</td>
            <td>{{ u.username }}</td>
            <td>{{ u.email }}</td>
            <td>
                <a href="delete/{{ u.id }}">删除</a>
            </td>
        </tr>
    {% endfor %}
</table>
</body>
</html>

5.1 实现查询操作

from initdb import db, app, User
from flask import render_template


@app.route("/")
def find_all_users():
    users = User.query.all()
    print(users)
    return render_template("list.html", users=users)


if __name__ == '__main__':
    app.run()

3.访问的结果为:

sqlalchemy 更新新版本 sqlalchemy安装以及使用_sqlite_09


通过User.query.all()方法执行对user表的查询操作

5.2 执行查询单个用户的操作

@app.route("/get/<int:get_id>")
def get_by_id(get_id):
    get_user = User.query.get(get_id)  # User.query.filter_by(id=get_id).first()
    return "编号:{0},用戶名:{1},邮箱:{2}".format(get_user.id, get_user.username, get_user.email)

== 查询的时候可以使用两个方法执行查询操作:==

  1. 使用User.query.get(唯一的id编号)
  2. 使用User.query.filter_by(id=查询的条件).first(),通过条件进行查询操作

5.3 执行添加操作

@app.route("/add/<username>")
def add_user(username):
    new_user = User()
    new_user.username = username
    new_user.email = username + "@qq.com"
    db.session.add(new_user)
    db.session.commit()
    return redirect("/")

执行添加操作需要执行db.session.add(需要添加的对象),需要通过db.session.commit()提交保存的数据

5.4 执行删除操作

@app.route("/delete/<int:del_id>")
def delete_by_id(del_id):
    del_user = User.query.filter_by(id=del_id).first()
    if del_user is not None:
        db.session.delete(del_user)
        db.session.commit()
    return redirect("/")

需要通过db.session.delete(需要删除的对象),db.session.commit()

5.5 执行修改操作

@app.route("/update", methods=["POST"])
def update_user():
    if request.form["id"]:
        update_id = request.form["id"]
        update_user = User.query.get(update_id)
        update_user.username = request.form["username"]
        update_user.email = request.form["email"]
        db.session.commit()
    return redirect("/")

直接通过查询的方式获取需要修改的对象,然后重新赋值,最后直接提交即可

这里通过postman实现提交修改的表单操作

sqlalchemy 更新新版本 sqlalchemy安装以及使用_sqlite_10


发现执行成功!

6.总结

1.在使用SQLAlchemy的时候需要指定当前的操作

  1. app = Flask(__name__)
  2. app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite3'
  3. app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

2.创建一个SQLAlchemy的实例db = SQLAlchemy(app)

3.在创建数据对象的时候需要创建class,并且这个class需要继承db.Model,这点和当前的Django的关系操作数据的差不多一致

4.通过db.Column创建指定的字段和当前的需要的数据类型!

5.然后再操作的时候需要使用当前的db的操作,通过db.session执行其他的操作,通过类.query.get方式获取id为指定的对象,通过类.query.filter_by(通过指定条件查询数据),可以通过all()实现查询所有数据,通过first()获取第一个数据

6.通过db.session.add方法添加对象,通过db.session.delete方法删除对象,所有的增加删除修改操作都需要执行db.session.commit()

以上纯属个人见解,如有问题请联系本人!