由于前面大概学习了Flask框架,了解了具体对的操作,所以今天学习操作数据库,使用flask-SQLAlchemy操作数据库!(数据库就使用sqlite3)
1.使用cmd方式执行pip install flask-sqlalchemy
pip install flask-sqlalchemy
结果如下:
2.查看是否安装当前的flask-sqlalchmy成功
发现安装成功!当前的Flask-SQLAlchemy的版本为:Flask-SQLAlchemy 2.4.1
官方的快速教程: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 '' % self.username
当前的app.config[‘SQLALCHEMY_DATABASE_URI’]我设置为sqlite:///db.sqlite3,就表示我才用的是本地的db.sqlite3文件
2.按照官方执行操作,使用命令行执行操作
from app import db
结果:报错
3.向当前的app.py中的前面添加这样一句话:app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
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 '' % self.username
5.查看当前的db.sqlite3文件
发现当前的官方的操作巨坑,有的时候就会出现错误!
1.首先查看生成的数据库结构:
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一样)
1.首先将当前的app.py文件中原来的内容放入到一个initdb.py中
2.然后在当前的app.py中添加以下内容
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
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>
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.访问的结果为:
通过User.query.all()方法执行对user表的查询操作
!
@app.route("/get/" )
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)
== 查询的时候可以使用两个方法执行查询操作:==
User.query.get(唯一的id编号)
User.query.filter_by(id=查询的条件).first(),通过条件进行查询操作
@app.route("/add/" )
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()提交保存的数据
@app.route("/delete/" )
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()
@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实现提交修改的表单操作
发现执行成功!
1.在使用SQLAlchemy的时候需要指定当前的操作
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite3'
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()
以上纯属个人见解,如有问题请联系本人!